您的过滤器函数没有返回任何内容,因此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;
}
});
});
的.some()
方法返回true
如果至少1调用回调返回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));
有一个在链接的文档一个填充工具来修补这还没有.indcludes()
旧的实现。
@squint我想的foreach返回冒泡到过滤器的恢复。现在我的错误 – MeanMan
这是一个常见的错误,但没有。如果确实如此,它会有停止调用堆栈中的所有功能的副作用,这通常是不希望的。 –