以下为详细回答,望采纳
可以使用 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));