Javascript 具有不同筛选器的条件.filter()函数

Javascript 具有不同筛选器的条件.filter()函数,javascript,filter,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'

我有很多人:

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'
  }
]
我需要能够基于一个、多个或所有属性过滤原始数组,因此,例如,我可以为每个对象的每个属性设置一个变量

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
然后只需使用过滤功能:

let filtered = people.filter(person => person[filter.name] === filter.value && person[filterTwo.name] === filterTwo.value && person[filterThree.name] === filterThree.value);

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

我想你可以有这样的过滤器映射

const people=[{
姓名:'约翰',
性别:'M',
哈苏斯:“是的”,
哈斯卡:“是的”
},
{
姓名:'卡尔',
性别:'M',
哈苏斯:“不”,
哈斯卡:“不”
},
{
名字:'丽莎',
性别:'F',
哈苏斯:“是的”,
哈斯卡:“不”
},
{
姓名:'玛丽',
性别:'F',
哈苏斯:“是的”,
哈斯卡:“是的”
},
{
姓名:'大卫',
性别:'M',
哈苏斯:“不”,
哈斯卡:“是的”
}
];
常数filterOn=(arr,filters)=>{
返回对象。键(过滤器)。减少((acc,k)=>{
返回附件过滤器(项目=>{
返回项[k]==过滤器[k];
});
},arr);
};
log(filterOn(people,{hasHouse'Yes',hasCar'Yes'});

您可以将过滤器放入一个数组中并使用
。每个

let过滤器=[
{名称:“性别”,值:“M”},
{name:“hasCar”,value:“Yes”},
{name:“hasHouse”,value:“Yes”},
];
people.filter(v=>filters.every(f=>v[f.name]==f.value));
如果不想使用过滤器,可以将其从阵列中取出