使用另一个数组在underscorejs中过滤数组

时间:2017-04-04 06:23:41

标签: javascript arrays underscore.js

var list1 =[{user: "A", id: 'a'},
            {user: "B", id: 'b'},
            {user: "C", id: 'c'},
            {user: "D", id: 'd'},
            {user: "E", id: 'e'}];
var list2 = ["A","B","C"];

我有两个数组,我想使用list2过滤list1。我的输出应为[{id:' a'},{id:' b'},{id:' c'}]或仅['} ;一个'' b'' C']

我正在按照以下方式过滤,但没有得到任何结果。这有什么不对?

var ids = _.filter(list1, function(id) { 
                    _.each(list2, function(name){ 
                            return id.user === name; 
                    }); 
          });

2 个答案:

答案 0 :(得分:3)

在普通的Javascript中,您只需过滤数组,然后将id映射到结果集。

var list1 =[{ user: "A", id: 'a' }, { user: "B", id: 'b' }, { user: "C", id: 'c' }, { user: "D", id: 'd' }, { user: "E", id: 'e' }],
    list2 = ["A","B","C"],
    result = list1.filter(a => list2.includes(a.user)).map(a => a.id);
    
console.log(result);

使用下划线

var list1 =[{ user: "A", id: 'a' }, { user: "B", id: 'b' }, { user: "C", id: 'c' }, { user: "D", id: 'd' }, { user: "E", id: 'e' }],
    list2 = ["A","B","C"],
    result = _.pluck(_.filter(list1, a => _.contains(list2, a.user)), 'id');
    
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

答案 1 :(得分:2)

filter内的函数应返回一个布尔含义&#34;保持&#34;或者&#34;不要保留它&#34;。 each对数组的每个元素执行操作,但不返回任何内容。

简单的解决方法是使用find代替each

var ids = _.filter(list1, function(id) {      
  return _.find(list2, function(name) { return id.user === name; });
});

要仅提取ID,请使用map

ids = ids.map(function(user){ return user.id });