具有不同过滤器的条件 .filter() 函数

ahz*_*zep 0 javascript filter

我有一群人:

let people = [{
    name: 'John',
    sex: 'M',
    hasHouse: 'Yes',
    hasCar: 'Yes'
  },
  {
    name: 'Carl',
    sex: 'M',
    hasHouse: 'No',
    hasCar: 'No'
  },
  {
    name: 'Lisa',
    sex: 'F',
    hasHouse: 'Yes',
    hasCar: 'No'
  },
  {
    name: 'Mary',
    sex: 'F',
    hasHouse: 'Yes',
    hasCar: 'Yes'
  },
  {
    name: 'David',
    sex: 'M',
    hasHouse: 'No',
    hasCar: 'Yes'
  }
]
Run Code Online (Sandbox Code Playgroud)

我需要能够基于一个、多个或所有属性过滤原始数组,例如,我可以为每个对象的每个属性设置一个变量

let filter = {name: 'sex',value: 'M'};
let filterTwo = {name: 'hasCar',value: 'Yes'};
let filterThree = {name: 'hasHouse',value: 'Yes'};
// The value would be changed by the user
Run Code Online (Sandbox Code Playgroud)

然后只需使用过滤器功能:

let filtered = people.filter(person => person[filter.name] === filter.value && person[filterTwo.name] === filterTwo.value && person[filterThree.name] === filterThree.value);
Run Code Online (Sandbox Code Playgroud)

问题是,如果您只想使用一个过滤器(过滤器将与未选择的过滤器中的 null 进行比较),则它不起作用。还有一个事实是,我觉得代码不够高效,可以做得更好。

Apl*_*123 5

您可以将过滤器放在一个数组中并使用.every

let filters = [
    { name: "sex", value: "M" },
    { name: "hasCar", value: "Yes" },
    { name: "hasHouse", value: "Yes" },
];

people.filter(v => filters.every(f => v[f.name] === f.value));
Run Code Online (Sandbox Code Playgroud)

如果不想使用过滤器,可以将其从数组中取出。