javascript filter array multi condition

2022-08-30 04:37:22

我想简化一个对象数组。让我们假设我有以下数组:

var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
    },
    {
        name: 'Tom',
        email: 'tom@mail.com',
        age: 35,
        address: 'England'
    },
    {
        name: 'Mark',
        email: 'mark@mail.com',
        age: 28,
        address: 'England'
}];

和过滤器对象:

var filter = {address: 'England', name: 'Mark'};

例如,我需要按地址和名称过滤所有用户,所以我会遍历过滤器对象属性并检查出来:

function filterUsers (users, filter) {
    var result = [];
    for (var prop in filter) {
        if (filter.hasOwnProperty(prop)) {

            //at the first iteration prop will be address
            for (var i = 0; i < filter.length; i++) {
                if (users[i][prop] === filter[prop]) {
                    result.push(users[i]);
                }
            }
        }
    }
    return result;
}

所以在第一次迭代时会等于两个用户将被添加到数组结果(名称为Tom和Mark),但是在第二次迭代时将等于只有最后一个用户应该被添加到数组结果中,但我最终在数组中有两个元素。prop - address'England'prop nameMark

我有一点想法,为什么它会发生,但仍然坚持它,找不到一个好的解决方案来修复它。任何帮助都是可观的。谢谢。


答案 1

你可以这样做

var filter = {
  address: 'England',
  name: 'Mark'
};
var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];


users= users.filter(function(item) {
  for (var key in filter) {
    if (item[key] === undefined || item[key] != filter[key])
      return false;
  }
  return true;
});

console.log(users)

答案 2

如果您知道过滤器的名称,则可以在一行中执行此操作。

users = users.filter(obj => obj.name == filter.name && obj.address == filter.address)