首页 > 解决方案 > 如何使用数组中的值过滤javascript中的嵌套数组以使其也适用于单个值?

问题描述

我想出了另一个主题的示例,它可以从另一个存储过滤器值的数组中过滤嵌套数组。

有趣的是,当数组中有单个元素时,它不能很好地工作。

const data = [
    {
        "guid": "j5Dc9Z",
        "courses": [
            {
                "id": 3,
                "name": "foo"
            }
        ]
    },
    {
        "guid": "a5gdfS",
        "courses": [
            {
                "id": 1,
                "name": "bar"
            },
            {
                "id": 3,
                "name": "foo"
            }
        ]
    },
    {
        "guid": "jHab6i",
        "courses": [
            {
                "id": 7,
                "name": "foobar"
            }
        ]
    }
];

const courses = [3];
const r = data.filter(d => d.courses.every(c => courses.includes(c.id)));
console.log(r);

在我的示例中,我们应该看到两个 3,但它给了我们第一个。如何过滤这个嵌套数组与多个值或单个?

标签: javascriptarrays

解决方案


您在这里要求所有/每个对象都具有 id == 3,但您想要的是让任何/某些对象具有 id == 3,如下所示:

const data = [{
    "guid": "j5Dc9Z",
    "courses": [{
      "id": 3,
      "name": "foo"
    }]
  },
  {
    "guid": "a5gdfS",
    "courses": [{
      "id": 1,
      "name": "bar"
    }, {
      "id": 3,
      "name": "foo"
    }]
  }, {
    "guid": "jHab6i",
    "courses": [{
      "id": 7,
      "name": "foobar"
    }]
  }
];
const courses = [3];
const r = data
  .filter(d => d.courses.some(c => courses.includes(c.id)))
  .map(d => ({ ...d, courses: d.courses.filter(c => courses.includes(c.id))
  }));
console.log(r);


推荐阅读