【问题标题】:How to filter array of objects with nested arrays of objects based on other arrays如何使用基于其他数组的嵌套对象数组过滤对象数组
【发布时间】:2021-08-22 02:30:43
【问题描述】:

示例代码。

const cards = [
    {
        id: "1",
        name: "J",
        tag: [
          {
            "colour": "red"
          },
          {
            "colour": "yello"
          },
          {
            "colour": "blue"
          },
          {
            "colour": "white"
          },
        ],
        size: [
          {
            "name": "small"
          },
          {
            "name": "medium"
          },
        ],
    },
    {
        id: "2",
        name: "S",
        tag: [
          {
            "colour": "red"
          },
          {
            "colour": "green"
          },
          {
            "colour": "black"
          },
        ],
        size: [
          {
            "name": "small"
          },
          {
            "name": "medium"
          },
        ],
    },
    {
        id: "3",
        name: "K",
        tag: [
          {
            "colour": "green"
          },
          {
            "colour": "purple"
          },
          {
            "colour": "brown"
          },
          {
            "colour": "white"
          },
        ],
        size: [
          {
            "name": "large"
          },
        ],
    }
];

测试数组

const sizeArray = ["medium", "small"];
const tagArray = ["red", "black"];

我希望过滤后的对象数组仅包含此示例中的第二个对象。只过滤那些符合所有条件的人,给我留下一个新的对象数组。

我已经尝试过使用 .filter、.some、.includes 并且没有运气查看类似问题的许多其他答案。

非常感谢。

【问题讨论】:

  • 您能描述一下您想要什么以及期望的结果是什么样的吗?

标签: javascript arrays filter filtering


【解决方案1】:

当您使用filter 主数组时,您需要确保tag 值中的至少一个在tagArray 中,并且size 值中的至少一个在sizeArray 中。这可以使用includes 来实现。

const cards=[{id:"1",name:"J",tag:[{colour:"red"},{colour:"yello"},{colour:"blue"},{colour:"white"}],size:[{name:"small"},{name:"medium"}]},{id:"2",name:"S",tag:[{colour:"red"},{colour:"green"},{colour:"black"}],size:[{name:"small"},{name:"medium"}]},{id:"3",name:"K",tag:[{colour:"green"},{colour:"purple"},{colour:"brown"},{colour:"white"}],size:[{name:"large"}]}];

const sizeArray = ["medium", "small"];
const tagArray = ["red", "black"];

const filtered = cards.filter((card) => {
  return (
    card.tag.some((tag) => tagArray.includes(tag.colour)) &&
    card.size.some((size) => sizeArray.includes(size.name))
  );
});

console.log(filtered);

请注意,includes 效率不是很高,但我假设您在这里没有处理大量数据。如果您的sizeArraytagArray 特别大,您可以查看类似Set 的对象以提高哈希表效率。

【讨论】:

  • 需要为 tagArray.every && sizeArray.every 以便只返回 op 期望的第二个对象
  • 如果您测试过滤器数组,肯定会在对象中找到每个值。使用该方法查看下面的答案
  • 谢谢你,尼克,这很有帮助。我确实需要它只返回与查理评论匹配的对象。我会听取您对哈希表效率的建议,因为数据库数据集可能会很大。再次感谢。
【解决方案2】:

您可以将filtereverysome 一起使用。

由于您需要分别在sizetag 数组中过滤包含所有sizeArraytagArray 的结果。

const cards = [
  {
    id: "1",
    name: "J",
    tag: [
      {
        colour: "red",
      },
      {
        colour: "yello",
      },
      {
        colour: "blue",
      },
      {
        colour: "white",
      },
    ],
    size: [
      {
        name: "small",
      },
      {
        name: "medium",
      },
    ],
  },
  {
    id: "2",
    name: "S",
    tag: [
      {
        colour: "red",
      },
      {
        colour: "green",
      },
      {
        colour: "black",
      },
    ],
    size: [
      {
        name: "small",
      },
      {
        name: "medium",
      },
    ],
  },
  {
    id: "3",
    name: "K",
    tag: [
      {
        colour: "green",
      },
      {
        colour: "purple",
      },
      {
        colour: "brown",
      },
      {
        colour: "white",
      },
    ],
    size: [
      {
        name: "large",
      },
    ],
  },
];

const sizeArray = ["medium", "small"];
const tagArray = ["red", "black"];

const result = cards.filter(({ tag, size }) =>
    sizeArray.every((s) => size.some((si) => si.name === s)) &&
    tagArray.every((t) => tag.some((ta) => ta.colour === t))
);

console.log(result);

【讨论】:

  • 完成。再次感谢,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2021-07-07
  • 2020-10-17
  • 1970-01-01
  • 2020-12-14
  • 2021-03-21
  • 2020-07-18
相关资源
最近更新 更多