繁体   English   中英

打字稿过滤对象数组

[英]Typescript filter an array of objects

我想根据存储在过滤器中的值过滤results数组。 我尝试了下面的代码。 但这并不适用。

let filters = {
  name: ["Krishna", "Naveen"],
  city : ["London"]
};
results = [
{
    "name": "Krishna#Surname",
    "city": "London",
    "age": 23
},
{
    "name": "Naveen#Surname",
    "city": "London",
    "age": 23
},
{
    "name": "Krishna#Surname",
    "city": "NewYork",
    "age": 23
},
{
    "name": "Praveen#Surname",
    "city": "Washington",
    "age": 23
}
]
this.results1 = this.multiFilter(results,filters);

multiFilter(array:any=[], filters:Object) {
const filterKeys = Object.keys(filters);
return array.filter((item) => {
  return filterKeys.every(key => {
    let filters1= filters[key];
    return filters1.every(key1 => {
      return !!~ item[key].indexOf(key1)
    });
  });
});
}

一种替代方法是将函数filter与函数includessome一起使用。

 let filters = { name: ["Krishna", "Naveen"], city : ["London"]}, results = [{ "name": "Krishna#Surname", "city": "London", "age": 23},{ "name": "Naveen", "city": "London", "age": 23},{ "name": "Krishna", "city": "NewYork", "age": 23},{ "name": "Praveen", "city": "Washington", "age": 23}], result = results.filter(({name, city}) => filters.name.some(n => name.includes(n)) && filters.city.includes(city)); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以检查每个过滤器,然后返回匹配所有条件的对象。

这种方法适用于任意数量的条件。

 function multiFilter(array, filters) { return array.filter(o => Object.keys(filters).every(k => [].concat(filters[k]).some(v => o[k].includes(v)))); } var filters = { name: ["Krishna", "Naveen"], city: ["London"] }, results = [{ name: "Krishna#Surname", city: "London", age: 23 }, { name: "Naveen#Surname", city: "London", age: 23 }, { name: "Krishna#Surname", city: "NewYork", age: 23 }, { name: "Praveen#Surname", city: "Washington", age: 23 }], filtered = multiFilter(results, filters); console.log(filtered); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以filter数组,并使用includes检查数组中是否includes名称和城市

 let filters = {name: ["Krishna", "Naveen"],city: ["London"]}; let results = [{"name": "Krishna","city": "London","age": 23},{"name": "Naveen","city": "London","age": 23},{"name": "Krishna","city": "NewYork","age": 23},{"name": "Praveen","city": "Washington","age": 23}] let result = results.filter(o => filters.name.includes(o.name) && filters.city.includes(o.city)); console.log(result); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM