如何通过匹配所有值而不是一个值来过滤对象数组

How to filter the array of object by matching all values instead of one

我正在实施过滤器。它工作正常。问题是它只是匹配单个对象值而不是所有值匹配。

这里的匹配的意思是,让它包含值中的任意单个字母

示例:这是我的对象

{name:"D",color:"Green",size:50}

如果我将过滤器对象传递为:

let filter1 = {color:"Blu",size:'50'};

目前我通过匹配大小得到单一结果。但是颜色完全不匹配。所以结果应该是空的。

如何对对象中的所有值进行mach并得到过滤后的值。

Live Demo

代码:

const nestedFilter = (targetArray, filters) => targetArray.filter(o => Object.keys(filters).find(k => filters[k].includes(o[k])));

let products = [
  {name:"A",color:"Blue",size:70},
  {name:"B",color:"Blue",size:60},
  {name:"C",color:"Black",size:70},
  {name:"D",color:"Green",size:50}
];

let filter1 = {color:"Blu",size:'50'};


console.log(nestedFilter(products, filter1));

.find 调用替换为 .every。请注意,通过使用 includes,您希望 属性 值是字符串。

如果您希望 includes 以相反的方式工作,以便过滤器值可以是数据的子字符串,您应该这样做:

const nestedFilter = (targetArray, filters) => 
    targetArray.filter(o => Object.keys(filters).every(k =>
        String(o[k]).includes(filters[k]))
    )
)

o[k] 值需要转换为字符串,否则您无法对其应用 includes(参见 size,这是一个数字)

检查传递的过滤器 Object.entriesevery 是否等于被迭代对象上的相同条目。如果你想要部分匹配并且使用不同类型的变量,听起来你还需要先将它们强制转换为字符串,所以你可以使用 .includes.

const nestedFilter = (targetArray, filters) => targetArray.filter(
  obj => Object.entries(filters).every(
    ([key, val]) => String(obj[key]).includes(val)
  )
);

let products = [
  {name:"A",color:"Blue",size:70},
  {name:"B",color:"Blue",size:60},
  {name:"C",color:"Black",size:70},
  {name:"D",color:"Green",size:50},
  {name:"E",color:"Blu",size:'50'}
];

let filter1 = {color:"Blu",size:'70'};


console.log(nestedFilter(products, filter1));