具有动态过滤标准的JS Array.filter

Him*_*mel 4 javascript

如何在不指定过滤器数量的情况下动态声明一组过滤条件?

例如,如果我有一组数据,如下所示:

var data = [ 
  { item: { type: 'wood', size: 10 } }, 
  { item: { type: 'wood', size: 8 } },
  { item: { type: 'metal', size: 8 } } 
]
Run Code Online (Sandbox Code Playgroud)

我知道我可以用JS .filter()来获取所有具有的项目type woodsize 8:

function filterItems() {
  return data.filter(function(val) {
    return val['item'].type == 'wood' && 
           val['item'].size == 8;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想过滤具有未知数量的过滤器的项目,并.filter()返回data符合这些标准的所有项目,该怎么办?

这是一个反映上述代码的codepen.

Ami*_*mit 9

您可以将一系列条件传递给filterItems()函数.试试这个:

function filterItems(filters) {
  return data.filter(function(val) {
    for(var i = 0; i < filters.length; i++)
      if(val['item'][filters[i][0]] != filters[i][1])
        return false;
    return true;
  }
}
filterItems([['type', 'wood'], ['size', 8], ['someother', 'value']]);
Run Code Online (Sandbox Code Playgroud)

可以以各种格式应用相同的想法,例如使用对象而不是数组来提高可读性.