如何过滤对象数组

Jee*_*van 0 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' }
];
Run Code Online (Sandbox Code Playgroud)

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

[
  { 'user': 'barney',  'age': 36, 'active': true , 'company':'abc' },
  { 'user': 'pebbles', 'age': 1,  'active': true,  'company':'xyz' }
];
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的装载

console.log(_.filter(users, {'company': 'xyz','company': 'abc'}))
Run Code Online (Sandbox Code Playgroud)

它没有正确过滤.任何人都可以帮我这个.

Qua*_*nnt 5

只需使用默认语法,这应该工作

  _.filter(users, function(user) { return user.company == 'abc' || user.company == 'xyz'; });
Run Code Online (Sandbox Code Playgroud)

您的代码首先不起作用的简短原因

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

是因为您传递的是具有重复属性名称的javascript对象,company因此具有值的第二个属性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
Run Code Online (Sandbox Code Playgroud)

这导致只有巴尼被退回.