如何过滤对象数组

时间:2016-06-15 10:39:29

标签: arrays underscore.js lodash

我有像这样的对象数组

var users = [
  { 'user': 'barney',  'age': 36, 'active': true , 'company':'abc' },
  { 'user': 'fred',    'age': 40, 'active': false, 'company':'pqr' },
  { 'user': 'pebbles', 'age': 1,  'active': true,  'company':'xyz' }
];

我想过滤公司是abc或xyz 的对象数组,所以结果应该是这样的

[
  { 'user': 'barney',  'age': 36, 'active': true , 'company':'abc' },
  { 'user': 'pebbles', 'age': 1,  'active': true,  'company':'xyz' }
];

我正在使用像这样的装载

console.log(_.filter(users, {'company': 'xyz','company': 'abc'}))

未正确过滤。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:5)

只需使用默认语法,这应该可以正常工作

  _.filter(users, function(user) { return user.company == 'abc' || user.company == 'xyz'; });

您的代码首先无法正常工作的简短原因

_.filter(users, {'company': 'xyz','company': 'abc'})

是因为您传递的是具有重复属性名称company的javascript对象,因此值为abc的第二个属性会覆盖第一个属性。这意味着你实际上在做这个

_.filter(users, {'company': 'abc'})

然后将此对象{'company': 'abc'}传递给_.matches以生成函数,然后此函数将验证数组的每个元素。

  var predicate = _.matches({'company': 'abc'});
  predicate( { 'user': 'barney',  'age': 36, 'active': true , 'company':'abc' }); // true
  predicate(  { 'user': 'fred',    'age': 40, 'active': false, 'company':'pqr' }); // false
  predicate(    { 'user': 'pebbles', 'age': 1,  'active': true,  'company':'xyz' }); // false

导致只返回barney。