繁体   English   中英

根据另一个值数组过滤对象数组,返回一个空列表

[英]filtering an array of objects based on another array of values, returning an empty list

我正在尝试使用另一个值数组来过滤对象数组,但是我得到的是一个空列表。 下面是我的代码

[{'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的回调函数没有将布尔值返回给filter的父回调函数。 有没有办法做到这一点?

您的过滤器函数什么也不返回,因此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次调用返回true.some()方法将返回true 一旦返回真值,它也会暂停迭代。


仅供参考,您可以通过删除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
    });
});

甚至可以通过使用新的arrow函数语法来实现更多功能。

[{'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()来修补尚无.indcludes()较早实现。

[{'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;
    });

使用Array.filterArray.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"
    }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM