首页 > 解决方案 > 从对象数组中的嵌套数组中删除重复项

问题描述

我有这个对象数组:

const arrayOfObjects = [{
    id: 10,
    children: [1000]
  },
  {
    id: 10,
    children: [2000]
  },
  {
    id: 20,
    children: [1000]
  },
  {
    id: 20,
    children: [1000, 2000]
  },
  {
    id: 20,
    children: [2000]
  },
];

我想使用以下代码删除重复项:

  const arrayHashMap = arrayOfObjects.reduce((obj, item) => {
    if (obj[item.id]) {
      // obj[item.id].children.push(...item.children);
      const temporaryArray = [...obj[item.id].children, ...item.children];
      obj[item.id].children = [...new Set(temporaryArray)];
    } else {
      obj[item.id] = {
        ...item
      };
    }
    return obj;
  }, {});
  const result = Object.values(arrayHashMap);

在这段代码中,我注释了将值推送到数组的部分。我尝试使用“new Set”从最终数组中删除重复项,但我总是将值分配给“obj[item.id].children”。这可以吗还是有更好的方法来写这个?

预期结果:

[{
  id: 10,
  children: [1000, 2000]
}, {
  id: 20,
  children: [1000, 2000]
}]

谢谢

标签: javascriptarraysduplicates

解决方案


如果值不存在,您可以分组id并检查数组,然后推送该值。

const
    data = [{ id: 10, children: [1000] }, { id: 10, children: [2000] }, { id: 20, children: [1000] }, { id: 20, children: [1000, 2000] }, { id: 20, children: [2000] }],
    result = Object.values(data.reduce((r, { id, children }) => {
        r[id] ??= { id, children: [] };
        children.forEach(v => {
            if (!r[id].children.includes(v)) r[id].children.push(v);
        })
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读