用javascript过滤数组

时间:2019-04-30 08:35:21

标签: javascript typescript

我有过滤器数组,需要获取在项目.fruit和veg过滤器中具有这些过滤器的项目,我需要获取同时具有两个过滤器的项目。过滤项目的最佳方法是什么?

fruitfilter: [] = [{fruitname: "apple"} , {fruitname:"orange"}]
vegetablefilter: [] = [{vegetablename:"tomato"}, {vegetablename:"potato"}]

items: [] = [{fruitname: "apple", vegetablename:"tomato"},
                     {fruitname: "melon", vegetablename:"onion"},
                     {fruitname: "banana", vegetablename:"onion"}]
result: [] = [{fruitname: "apple", vegetablename:"tomato"}]

2 个答案:

答案 0 :(得分:0)

只需检查includes。您将需要稍微更改数据类型以便在对象数组上进行比较-这就是fruitvegitable的用途:

const fruitfilter = [{fruitname: "apple"} , {fruitname:"orange"}];
const vegitablefilter = [{vegitablename:"tomato"}, {vegitablename:"potato"}];
const items = [{fruitname: "apple", vegitablename:"tomato"},{fruitname: "melon", vegitablename:"onion"},{fruitname: "banana", vegitablename:"onion"}];
const fruit = fruitfilter.map(({ fruitname }) => fruitname);
const vegitable = vegitablefilter.map(({ vegitablename }) => vegitablename);
const result = items.filter(item => item.fruitname ? fruit.includes(item.fruitname) : vegitable.includes(item.vegitablename));
console.log(result);

答案 1 :(得分:0)

您可以像这样使用filtersome

const fruitfilter=[{fruitname:"apple"},{fruitname:"orange"}],
      vegetablefilter=[{vegetablename:"tomato"},{vegetablename:"potato"}],
      items=[{fruitname:"apple",vegetablename:"tomato"},{fruitname:"melon",vegetablename:"onion"},{fruitname:"banana",vegetablename:"onion"}];

const result = 
  items.filter(i => fruitfilter.some(f => f.fruitname === i.fruitname)
                     && vegetablefilter.some(v => v.vegetablename === i.vegetablename))

console.log(result)

如果过滤器可以为空,则可以使用length

检查过滤器是否为空。
const result = 
  items.filter(i => (!fruitfilter.length || fruitfilter.some(f => f.fruitname === i.fruitname))
                     && (!vegetablefilter.length || vegetablefilter.some(v => v.vegetablename === i.vegetablename)))