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

Javascript 如何通过匹配所有值而不是一个值来过滤对象数组,javascript,filter,ecmascript-2016,Javascript,Filter,Ecmascript 2016,我正在实现一个过滤器。它很好用。问题是它只是匹配单个对象的值,而不是所有值的匹配 匹配的意思是,让它包含值中的任何单个字母 示例:这是我的对象 {名称:D,颜色:绿色,大小:50} 如果我将过滤器对象传递为: 让filter1={color:Blu,size:'50'} 目前我通过匹配大小得到单一结果。但颜色根本不匹配。所以结果应该是空的 如何计算对象中的所有值并获得过滤后的值 代码: const nestedFilter = (targetArray, filters) => targe

我正在实现一个过滤器。它很好用。问题是它只是匹配单个对象的值,而不是所有值的匹配

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

示例:这是我的对象

{名称:D,颜色:绿色,大小:50}

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

让filter1={color:Blu,size:'50'}

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

如何计算对象中的所有值并获得过滤后的值

代码:

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 cf.size,它是一个数字

检查所传递的筛选器的每个Object.entries是否等于所迭代对象上的相同条目。如果您想要部分匹配并且使用不同类型的变量,那么听起来您还需要首先将它们强制为字符串,以便可以使用.includes

const nestedFilter=targetArray,filters=>targetArray.filter obj=>Object.entriesfilters.every [key,val]=>Stringobj[key]。includeval ; 让产品=[ {名称:A,颜色:蓝色,尺寸:70}, {名称:B,颜色:蓝色,尺寸:60}, {名称:C,颜色:黑色,尺寸:70}, {名称:D,颜色:绿色,大小:50}, {名称:E,颜色:蓝色,大小:'50'} ]; 让filter1={color:Blu,size:'70'};
console.lognestedFilterproducts,filter1;是的,我传递了这个值,它变为空,而不是1。让filter1={color:Gr,size:'50'};如果希望include起作用,应该交换它的方向。见我的补充答案。注意includes是如何应用于较长的字符串的:o[k]我不寻找===,如果部分包含,对我来说也是ok。Gr在这里是局部的。我看到了,看到了我写的和添加的内容。如果我通过了let filter1={color:Blu,size:'70'};一无所获。价值可以部分包含罚款给我。对于上面的示例,我期望结果为{name:A,color:Blue,size:70},如果您愿意,听起来您需要将非字符串强制为字符串。includes可以处理部分匹配