js数组对象去重如何解决?

  1. 对象数组去重合并
    输入:const arr = [
    {id: 1, flag: {a: 1}},
    {id: 2, flag: {a: 1}},
    {id: 1, flag: {b: 1}},
    {id: 4, flag: {a: 1}}
    ];
    输出:[
    {id: 1, flag: {a: 1, b: 1}},
    {id: 2, flag: {a: 1}},
    {id: 4, flag: {a: 1}}
    ];

以下为详细回答,望采纳


可以使用 reduce() 方法遍历数组,并把对象按照 id 属性进行分组,把相同 id 属性的对象放到同一个数组中。

const arr = [
  {id: 1, flag: {a: 1}},
  {id: 2, flag: {a: 1}},
  {id: 1, flag: {b: 1}},
  {id: 4, flag: {a: 1}}
];

const result = arr.reduce((acc, cur) => {
  const existingItem = acc.find(item => item.id === cur.id);
  if (existingItem) {
    existingItem.flag = {...existingItem.flag, ...cur.flag};
  } else {
    acc.push(cur);
  }
  return acc;
}, []);

console.log(result);

ShowMeAI的思路差不多,我的思路也是使用reduce()进行遍历数组,如果数组存在,则将id放置对象中当作key储存用户下次判断对比。最后在将对象的values值输出。减少find再次搜索的逻辑,感觉上会快些。

const arr = [
    { id: 1, flag: { a: 1 } },
    { id: 2, flag: { a: 1 } },
    { id: 1, flag: { b: 1 } },
    { id: 4, flag: { a: 1 } }
];
const v = [
    { id: 1, flag: { a: 1, b: 1 } },
    { id: 2, flag: { a: 1 } },
    { id: 4, flag: { a: 1 } }
];
const res = Object.values(arr.reduce((pre, cur) => {
    if (pre[cur.id]) pre[cur.id].flag = Object.assign(pre[cur.id].flag, cur.flag)
    else pre[cur.id] = cur
    return pre
}, {}))
console.log(JSON.stringify(res) === JSON.stringify(v));