基于动态条件的最佳过滤方法

时间:2020-08-29 17:38:27

标签: javascript array-filter

这是我的示例代码

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

如果我要过滤多个条件,可以执行以下操作 过滤我们的夜班而不是新员工 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

我知道绝对有更好的方法可以做到这一点。任何建议或指向正确方向的信息都会很有帮助。

2 个答案:

答案 0 :(得分:0)

您可以获取所需过滤器的数组,并检查每个过滤器以获取结果。

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; }

答案 1 :(得分:0)

您可以使用以下内容:

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);
});