如何通过匹配所有值而不是一个值来过滤对象数组
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并得到过滤后的值。
代码:
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.entries
的 every
是否等于被迭代对象上的相同条目。如果你想要部分匹配并且使用不同类型的变量,听起来你还需要先将它们强制转换为字符串,所以你可以使用 .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));
我正在实施过滤器。它工作正常。问题是它只是匹配单个对象值而不是所有值匹配。
这里的匹配的意思是,让它包含值中的任意单个字母
示例:这是我的对象
{name:"D",color:"Green",size:50}
如果我将过滤器对象传递为:
let filter1 = {color:"Blu",size:'50'};
目前我通过匹配大小得到单一结果。但是颜色完全不匹配。所以结果应该是空的。
如何对对象中的所有值进行mach并得到过滤后的值。
代码:
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.entries
的 every
是否等于被迭代对象上的相同条目。如果你想要部分匹配并且使用不同类型的变量,听起来你还需要先将它们强制转换为字符串,所以你可以使用 .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));