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

3
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'}]或者只有['a','b','c']。以下是我用于筛选的方式,但是没有得到任何结果。这里出了什么问题?
var ids = _.filter(list1, function(id) { 
                    _.each(list2, function(name){ 
                            return id.user === name; 
                    }); 
          });
2个回答

4

在纯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);

使用underscore,

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>


.pluck和.contains在新版本中已不再可用。因此,请使用_.map代替_.pluck,并使用_.map代替_.contains - emkarachchi
@emkarachchi,很高兴知道您可以进行编辑。如果您愿意,您可以编辑此答案。 - Nina Scholz

2

filter函数内部的返回值应该是布尔类型,表示“保留”或“不保留”。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 });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接