Вопрос проверяет понимание паттерна проектирования 'Декоратор' или композиции функций для расширения базовой фильтрации в пользовательских интерфейсах или бизнес-логике.
Добавление базовых (системных) фильтров к пользовательским — это задача расширения функциональности фильтрации, часто встречающаяся в интерфейсах админ-панелей, отчетов или API. Базовые фильтры обеспечивают обязательные ограничения, например, фильтрацию по организации пользователя или временному периоду, в то время как пользовательские фильтры предоставляют гибкость для настройки запросов.
Существует два основных архитектурных подхода:
Рассмотрим простой пример композиции функций для фильтрации массива объектов-пользователей.
// Базовые фильтры (системные)
const filterByActive = (users) => users.filter(u => u.isActive);
const filterByOrg = (orgId) => (users) => users.filter(u => u.orgId === orgId);
// Пользовательский фильтр (динамический)
const filterByName = (name) => (users) => users.filter(u => u.name.includes(name));
// Функция для композиции фильтров
const applyFilters = (data, filters) => {
return filters.reduce((result, filterFn) => filterFn(result), data);
};
// Пример использования
const allUsers = [
{ id: 1, name: 'Alice', isActive: true, orgId: 101 },
{ id: 2, name: 'Bob', isActive: false, orgId: 101 },
{ id: 3, name: 'Charlie', isActive: true, orgId: 102 }
];
// Создаем цепочку: сначала базовые, потом пользовательские
const filters = [
filterByActive, // Базовый: только активные
filterByOrg(101), // Базовый: только организация 101
filterByName('A') // Пользовательский: имя содержит 'A'
];
const filteredUsers = applyFilters(allUsers, filters);
console.log(filteredUsers); // [{ id: 1, name: 'Alice', ... }]В этом примере базовые фильтры (filterByActive, filterByOrg) задают обязательные условия, а пользовательский (filterByName) добавляет дополнительное уточнение. Порядок применения может быть важен: обычно базовые фильтры применяются первыми для сокращения объема данных.
Данный подход широко используется в:
Вывод: Добавлять базовые фильтры к пользовательским следует через композицию или декоратор, что обеспечивает соблюдение системных ограничений и предоставляет гибкость. Этот подход стоит применять везде, где требуется разделить обязательную бизнес-логику и настраиваемые пользователем условия отбора данных.