如何检查子数组是否包含另一个数组的所有元素javascript

时间:2021-02-19 16:37:07

标签: javascript filter

我有一个名为 rawProjects 的项目数组,如下所示:

rawProjects = [
    {
         id: 1,
         name: "proj1",
         technology: [
             0: {id: 21, project_id: 1,name: "java"},
             1: {id: 22, project_id: 1,name: "c++"}
          ]
    },
    {
         id: 2,
         name: "proj2",
         technology: [
             0: {id: 23, project_id: 2,name: "sql"},
             1: {id: 24, project_id: 2,name: "python"},
             2: {id: 25, project_id: 2,name: "react"}

         ]
    }
]

我还有一组名为 tempTags 的技术,其中包含用户输入以进行搜索的技术。到目前为止,我已经能够执行 OR 案例,其中我返回包含用户使用以下任一技术的项目:

const filteredProjects = rawProjects.filter(x => x.technology.some(g => tempArr.includes(g.name)))

例如,如果 tempTags = [sql, c++] 两个项目都将返回。

我如何实现 AND 情况,以便只返回包含这两种技术的项目。例如,如果 tempTags = [java, c++] ,则只会返回第一个项目。如果tempTags = [sql, c++],什么都不会返回?

1 个答案:

答案 0 :(得分:1)

迭代 tempTags 并检查是否包含 .every 之一:

const rawProjects = [
    {
         id: 1,
         name: "proj1",
         technology: [
             {id: 21, project_id: 1,name: "java"},
             {id: 22, project_id: 1,name: "c++"}
          ]
    },
    {
         id: 2,
         name: "proj2",
         technology: [
             {id: 23, project_id: 2,name: "sql"},
             {id: 24, project_id: 2,name: "python"},
             {id: 25, project_id: 2,name: "react"}

         ]
    }
]

const tempTags = ['java', 'c++'];
const filtered = rawProjects.filter(
  p => {
    const techNames = p.technology.map(({ name }) => name);
    return tempTags.every(
      tag => techNames.includes(tag)
    );
  }
);
console.log(filtered);

您还需要修正语法:数组没有键值对,只有值。 (去掉 0:1: 等),并确保在数组值之间放置逗号("python"} 后应该有一个逗号)