下划线过滤器

时间:2015-09-29 18:39:02

标签: javascript underscore.js

我试图使用下划线where来过滤一系列对象,但我似乎无法弄清楚如何让它过滤多个值键。例如:

var itemsArr = [{name:"foo", color:"red"}, {name:"bar", color:"blue"}, {name:"bob", color:"yellow"}];

我试图让它返回一个颜色为red的所有项目以及所有颜色为blue的项目的数组......这可能吗?我试过了

tempArr = _.where(itemsArr, {color:["red", "blue"]}); 

但那并没有奏效。如果我必须使用_.filter并写出我自己的谓词,我会想知道是否有其他人试图这样做并找到了解决方案。

5 个答案:

答案 0 :(得分:7)

使用filtercontains组合:

_.filter(itemsArr, function(item, index) {
  return _.contains(["red", "blue"], item.color);
})

答案 1 :(得分:3)

使用filter功能:

_.filter(itemsArr,function(itm){return itm.color=='red' || itm.color=='blue'})

答案 2 :(得分:1)

你可以运行_.where两次并连接两个结果数组吗?

tempArr = _.where(itemsArr, {color: "red"}).concat(_.where(itemsArr, {color: "blue"}));

答案 3 :(得分:1)

这是解决方案

 var itemsArr = [{name:"foo", color:"red"}, {name:"bar", color:"blue"}, {name:"bob", color:"red"}];
 var filter = ["red","blue"];
 var data = {};
 _.each(filter, function (item) { 
       data[item] = true; 
   });

 var returnData = _.filter(itemsArr, function (item) {
                    return data[item.color];
                 });

 console.log(returnData)

答案 4 :(得分:0)

根据documentation

  

查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组。

如果您愿意,还可以查看source code。在幕后,var1使用where

isMatch

由于您不能拥有两个相同的键,因此您无法按照自己的意愿行事。我会按照你的建议使用_.isMatch = function(object, attrs) { var keys = _.keys(attrs), length = keys.length; if (object == null) return !length; var obj = Object(object); for (var i = 0; i < length; i++) { var key = keys[i]; if (attrs[key] !== obj[key] || !(key in obj)) return false; } return true; };