如何在Javascript中筛选包含对象数组的数组?

3
 const books = [{
     id: "1",
     title: "Book title",
     areas: ["horror", "mystery"]
   }, {
     id: "2",
     title: "Book title 2",
     areas: ["friendship", "love", "history"]
   },
   {
     id: "2",
     title: "Book title 3",
     areas: ["friendship", "scifi"]
   }
 ];

这是我的书籍数组,我想根据分类创建一个新的数组。例如,如果用户点击“恐怖”按钮,则只加载具有“恐怖”分类的书籍, 我是JS的新手,找不到正确的方法。 我想创建一个名为filteredBooks的新数组。谢谢您的帮助!

使用 Array.includes() 方法。 - Barmar
@Mike'Pomax'Kamermans,我认为这不是一个好的重复项。它没有在嵌套数组中搜索值。 - Barmar
1
我相信这个问题可能有重复,但是我现在找不到任何相关的内容。 - Barmar
@barmar,问题标题有误导性,实际问题是关于同一个“带有对象的数组”,而不是真正的嵌套数组。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans,我看了一下这个问题。被匹配的属性只是一个单一的值,而不是像这个问题中的数组。 - Barmar
1
它们都涉及对象数组,但属性的比较方法完全不同。 - Barmar
2个回答

10

filter() -> 使用回调函数来决定筛选后数组的返回值。如果回调函数的返回值为 true,则将该项包含在结果数组中。

includes() -> 使用 == 相等性在项数组中搜索某个东西。

const books = [{
     id: "1",
     title: "Book title",
     areas: ["horror", "mystery"]
   }, {
     id: "2",
     title: "Book title 2",
     areas: ["friendship", "love", "history"]
   },
   {
     id: "3",
     title: "Book title 3",
     areas: ["friendship", "scifi"]
   }
];

const filterValue = "horror";
const filteredBooks = books.filter(val => val.areas.includes(filterValue));
console.log(filteredBooks);


3

既然已经有了一个很好的答案(由@Kirill Savik提供)来查找单一流派的书籍,我将利用这个机会扩展给定的答案,以便可以从中获取一个流派数组,以显示至少具有其中一个流派的书籍。

请看这个片段:

const books = [
    {
        id: "1",
        title: "Book title",
        areas: ["horror", "mystery"]
    }, 
    {
        id: "2",
        title: "Book title 2",
        areas: ["friendship", "love", "history"]
    },
    {
        id: "2",
        title: "Book title 3",
        areas: ["friendship", "scifi"]
    }
];

function filter_books(filters) {
    const filteredBooks = [];
    filters.forEach(filterValue => {
        filteredBooks.push(...books.filter(val => val.areas.includes(filterValue)));
    });
    console.log(filteredBooks);
};

filter_books(["horror", "scifi"]); // Outputs all books which have one or more of these ^ genres


1
过滤书籍并使用 some 检查 areas 是否包含筛选器会更容易一些:return books.filter(val => filters.some(filter => val.areas.includes(filter))) - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接