2017-04-04 81 views
2
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']。通过使用另一个阵列在underscorejs中筛选数组

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

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

回答

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

以下划线的

  • _.pluck用于获取一个属性的值,
  • _.contains一检查,如果值是在一个阵列和
  • _.filter为返回一个子集。

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>

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 });