我正在尝试使用另一个值数组过滤对象数组,但我得到一个空列表。以下是我的代码
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){
[1,2,3].forEach(function(id){
if(id == val.id){
return true;
}
});
});
我怀疑是
1)似乎内部forEach的回调函数不会将boolean返回给filter的父回调函数。有没有办法实现这个目标?
答案 0 :(得分:0)
您的过滤器功能没有返回任何内容,因此undefined
实际上是false
,这意味着它会从列表中排除。您的return
语句仅从forEach
回调中返回。
使用.some()
代替.forEach()
,并在其前面添加return
语句。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){
return [1,2,3].some(function(id){
if(id == val.id){
return true;
}
});
});
如果回调的至少1次调用返回truthy值,则.some()
方法返回true
。一旦返回truthy值,它也会暂停迭代。
仅供参考,您可以通过删除if
声明来缩短它。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){
return [1,2,3].some(function(id){
return id == val.id
});
});
使用新的箭头函数语法甚至更多。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]
.filter((val) => [1,2,3].some((id) => id == val.id));
或者由于您不需要任何复杂的逻辑来进行比较,您可以使用ES7 .includes()
方法,该方法基于严格的相等比较返回布尔结果。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]
.filter(function(val) { return [1,2,3].includes(val.id) });
或
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]
.filter((val) => [1,2,3].includes(val.id));
链接文档中有一个polyfill,用于修补尚未拥有.indcludes()
的旧实现。
答案 1 :(得分:0)
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){
var returnValue = false;
[1,2,3].forEach(function(id){
if(id == val.id){
returnValue = true;
}
});
return returnValue;
});
答案 2 :(得分:0)
使用Array.filter
和Array.indexOf
函数的方法非常简单:
var arr = [{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}];
arr = arr.filter(function(val){
return [1,2,3].indexOf(val.id) !== -1;
});
console.log(JSON.stringify(arr, 0, 4));
输出:
[
{
"id": 1,
"name": "x1"
},
{
"id": 2,
"name": "x2"
},
{
"id": 3,
"name": "x3"
}
]