【问题标题】:How to filter an array of object by multiple property values?如何通过多个属性值过滤对象数组?
【发布时间】:2020-04-21 21:15:06
【问题描述】:

如果我的数组包含一个数组值(多个标签),我该如何过滤数组,使其必须包含两个标签。从this example 工作,这是我目前拥有的代码。

let articles = [{title: 'title 1', tags :["JavaScript", "ES6"], category: "JavaScript"},{title: 'title 2', tags :["React", "TypeScript"], category: "React"},{title: 'title 3', tags :["JavaScript", "Inheritance", "Prototype"], category: "JavaScript"}]

let search = "ES6";
let search2 = "JavaScript";

let result = articles.filter(((data)=>data.tags.includes(search && search2)))

console.log(result)

但它似乎只过滤为“两者”而不是“两者”。在这个例子中,我希望它只返回标题 1。

谢谢

【问题讨论】:

  • data.tags.includes(search && search2) 只会检查search2,它甚至都不做“任何一个”。

标签: javascript arrays


【解决方案1】:

我们可以使用集合来完成对每个标签中唯一数组元素的搜索:

let search = "ES6";
let search2 = "JavaScript";
let articles = [{tags:["ES6", "JavaScript"]}, {tags:["ES6", "JavaQScript"]}, {tags:[ "JavaScript"]}, {tags:["ES6"]}]

let result = articles.filter((data)=>{const set1 = new Set(data.tags); return (set1.has(search) && set1.has(search2)) })

console.log(result)

【讨论】:

    【解决方案2】:

    let articles = [{
      title: 'title 1',
      tags: ["JavaScript", "ES6"],
      category: "JavaScript"
    }, {
      title: 'title 2',
      tags: ["React", "TypeScript"],
      category: "React"
    }, {
      title: 'title 3',
      tags: ["JavaScript", "Inheritance", "Prototype"],
      category: "JavaScript"
    }]
    
    let search = "ES6";
    let search2 = "JavaScript";
    
    let result = articles.filter(((data) => [search, search2].every((tag) => data.tags.includes(tag))))
    
    console.log(result)

    语法更简洁的替代方案

    let articles = [{
      title: 'title 1',
      tags: ["JavaScript", "ES6"],
      category: "JavaScript"
    }, {
      title: 'title 2',
      tags: ["React", "TypeScript"],
      category: "React"
    }, {
      title: 'title 3',
      tags: ["JavaScript", "Inheritance", "Prototype"],
      category: "JavaScript"
    }]
    
    let search = "ES6";
    let search2 = "JavaScript";
    
    let result = articles.filter(((data) => data.tags.includes(search) && data.tags.includes(search2)))
    
    console.log(result)

    【讨论】:

      【解决方案3】:

      您可以为想要的字符串获取一个数组,并检查所有短路情况。

      result = articles.filter(({ tags }) => [search, search2].some(s => tags.includes(s)));
      

      【讨论】:

      • 必须使用每个,而不是一些。
      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2019-05-29
      • 2019-01-17
      相关资源
      最近更新 更多