【问题标题】:How to filter the array of object by matching all values instead of one如何通过匹配所有值而不是一个值来过滤对象数组
【发布时间】:2019-06-22 07:11:14
【问题描述】:

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

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

示例:这是我的对象

{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));

【问题讨论】:

    标签: javascript filter ecmascript-2016


    【解决方案1】:

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

    【讨论】:

    • 我做到了,在我传递了这个值之后,它变成了空而不是 1。let filter1 = {color:"Gr",size:'50'};
    • 如果你想让includes 工作,你应该交换它的方向。请参阅我的答案。请注意includes 如何应用于“更长”字符串:o[k]
    • 我不是在寻找===,对我来说,如果部分包含也可以。 Gr 在这里不完整。
    • 我明白了,看看我写的和添加的。
    【解决方案2】:

    检查通过的过滤器的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));

    【讨论】:

    • 如果我通过let filter1 = {color:"Blu",size:'70'}; 将一无所获。价值可以部分包含对我来说很好。以上示例我预期的结果为{name:"A",color:"Blue",size:70},
    • 如果你想让.includes 使用部分匹配,听起来你也需要将非字符串强制转换为字符串
    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2020-02-02
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多