在编程中,数组是一种常见的数据结构,用于存储一系列元素。当数组中的元素是对象时,可能会出现重复的对象。删除重复对象并合并嵌套对象是一个常见的需求,尤其是在处理复杂数据结构时。
假设我们有一个数组,其中包含重复的对象,并且这些对象中有一些嵌套对象需要合并:
const data = [
{ id: 1, name: 'Alice', details: { age: 25, city: 'New York' } },
{ id: 2, name: 'Bob', details: { age: 30, city: 'Los Angeles' } },
{ id: 1, name: 'Alice', details: { age: 26, city: 'Chicago' } },
{ id: 3, name: 'Charlie', details: { age: 35, city: 'San Francisco' } }
];
const result = data.reduce((acc, current) => {
const existing = acc.find(item => item.id === current.id);
if (existing) {
// 合并嵌套对象
existing.details = { ...existing.details, ...current.details };
} else {
acc.push(current);
}
return acc;
}, []);
console.log(result);
reduce
方法遍历数组,创建一个新的数组acc
。acc
中查找是否存在与当前对象current
具有相同id
的对象。id
的对象,则合并嵌套对象details
。id
的对象,则将当前对象添加到acc
中。问题:在合并嵌套对象时,某些属性可能会被覆盖。
原因:Object.assign
或展开运算符{ ...existing.details, ...current.details }
会覆盖相同属性的值。
解决方法:在合并嵌套对象时,可以编写自定义逻辑来处理属性的合并,而不是简单地覆盖。
const mergeDetails = (existingDetails, currentDetails) => {
return {
age: existingDetails.age || currentDetails.age,
city: existingDetails.city || currentDetails.city
};
};
const result = data.reduce((acc, current) => {
const existing = acc.find(item => item.id === current.id);
if (existing) {
existing.details = mergeDetails(existing.details, current.details);
} else {
acc.push(current);
}
return acc;
}, []);
通过这种方式,可以确保嵌套对象的属性不会被简单覆盖,而是根据具体需求进行合并。
领取专属 10元无门槛券
手把手带您无忧上云