如何通过多个属性值过滤对象数组?

时间:2020-01-03 09:50:32

标签: javascript arrays

如果我的数组包含的值是一个数组(多个标签),如何过滤该数组,因此它必须包含两个标签。从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。

谢谢

3 个答案:

答案 0 :(得分:0)

您可以为所需的字符串获取一个数组,并通过短路检查所有字符串。

yes

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

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

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)