лучший способ фильтрации на основе динамического условия

Вот мой пример кода

data = [
{name: "Sam", age: 25, location: 'deleware', new_employee: true, shift: 'day'},
{name: "John", age: 45, location: 'new york', new_employee: false, shift: 'day'},
{name: "Tony", age: 65, location: 'california', new_employee: true, shift: 'evening'},
{name: "Bruce", age: 23, location: 'california', new_employee: true, shift: 'evening'},
{name: "Tom", age: 34, location: 'texas', new_employee: false, shift: 'day'},
{name: "Rob", age: 51, location: 'ohio', new_employee: false, shift: 'day'},
{name: "Jacob", age: 21, location: 'ohio', new_employee: false, shift: 'evening'},
{name: "Steve", age: 38, location: 'deleware', new_employee: false, shift: 'day'}
]

Если я хочу отфильтровать это, я могу сделать что-то вроде фильтрации всех вечерних смен:

data.filter(x=> x.shift=='evening') // gives me the filtered list

Если я хочу отфильтровать более одного условия, я могу сделать что-то вроде этого, чтобы отфильтровать нашу вечернюю смену, а не новый emp data.filter(x=> x.shift=='evening' && !x.new_employee) //gives me the exact one

Теперь проблема, с которой я столкнулся, заключается в том, что я не знаю, через какие фильтры пройдет пользователь. Я хочу построить этот фильтр динамически. В настоящее время я добиваюсь этого, используя несколько операторов if else для различных возможных комбинаций. комбинация включает

if name then that filter
else if name and age then another filter
else if name location then another filter
else if name and age and location another filter
and so on

Я знаю, что определенно есть лучший подход для этого. Любое предложение или указание в правильном направлении будет очень полезным.


person Sam    schedule 29.08.2020    source источник


Ответы (2)


Вы можете взять массив требуемых фильтров и проверить каждый фильтр для получения результата.

const
    data = [{ name: "Sam", age: 25, location: 'deleware', new_employee: true, shift: 'day' }, { name: "John", age: 45, location: 'new york', new_employee: false, shift: 'day' }, { name: "Tony", age: 65, location: 'california', new_employee: true, shift: 'evening' }, { name: "Bruce", age: 23, location: 'california', new_employee: true, shift: 'evening' }, { name: "Tom", age: 34, location: 'texas', new_employee: false, shift: 'day' }, { name: "Rob", age: 51, location: 'ohio', new_employee: false, shift: 'day' }, { name: "Jacob", age: 21, location: 'ohio', new_employee: false, shift: 'evening' }, { name: "Steve", age: 38, location: 'deleware', new_employee: false, shift: 'day' }],
    filters = [
        ({ age }) => age < 30,
        ({ shift }) => shift === 'evening'
    ],
    result = data.filter(o => filters.every(fn => fn(o)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 29.08.2020
comment
Это сработало. Спасибо :) - person Sam; 29.08.2020

Вы можете использовать что-то вроде этого:

data.filter(x=> {
x.shift=='evening' && !x.new_employee
    if (x.name.length<5) return nameFilter(x);
    else if (x.name==='Peter' && x.age>18) return ageFilter(x);
    else if (x.name.length>10 && x.location) return locationFilter(x);
    else return defaultFilter(x);
});
person Sascha    schedule 29.08.2020