Javascript多个过滤器数组

时间:2018-09-21 07:50:29

标签: javascript arrays filter

我的问题是对此问题的扩展javascript filter array multiple conditions
从这个问题开始,如果过滤器对象是

{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'
  }
];

所以答案是

[
  {
    "name": "Mark",
    "email": "mark@mail.com",
    "age": 28,
    "address": "England"
  }
]

这绝对好,但是我的问题是必须为过滤器对象属性值过滤数组
例如我的过滤器对象将是{address: 'England', name: ''},现在它必须过滤all names and address England的数组

5 个答案:

答案 0 :(得分:1)

您将对用户以及每个过滤器对象的条目使用过滤器

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

const res = users.filter(user => 
  Object.entries(filter)
  .every(([k,v]) => v === '' || user[k] === v)
);
console.log(res);
<script>
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'
  }
];
</script>

答案 1 :(得分:0)

在您提到的帖子中的示例中,如果过滤器为空白,则继续

var filter = {address: 'England', name: ''}
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 (filter[key] == "") continue; // added this:
    if (item[key] === undefined || item[key] != filter[key])
      return false;
  }
  return true;
});
console.log(users)

答案 2 :(得分:0)

您可以结合使用filterevery和三元逻辑来确定过滤器值是否为空以获取全部。

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 filter1 = {address: 'England', name: 'Mark'};
var filter2 = {address: 'England', name: ''};

function findResults(input, filterObj){
   return input.filter(
      item => Object.keys(filterObj)
                    .every(r => filterObj[r].length 
                                   ? item[r] == filterObj[r] 
                                   : true)
   )
}

console.log('with address and name', findResults(users,filter1));
console.log('with address only', findResults(users,filter2));

答案 3 :(得分:0)

如果我正确理解您的问题,则需要以下输出。 如果是这种情况,那么您正在寻找Array.filter的用例就足够了。 看一下code sandbox,我在其中创建了一个函数filterByObj,该函数将arr,filterObj作为参数并返回给定的{地址:“ England”,名称:“”}}

的输出。

enter image description here

答案 4 :(得分:-2)

在这种情况下,您需要df id app_0 app_1 app_2 sex top_1 top_2 0 1 a b c 0 b c 1 2 b c b 0 b c 2 3 c d a 1 a d 3 4 d NaN a 1 a d

filter