js合并相同结构的对象,内容不覆盖

本文介绍了如何在JavaScript中处理两个结构相同的对象,避免键值数据被后面的对象覆盖,通过使用`Object.keys`和`concat`方法实现了合并操作,生成了一个新的对象,保留了所有键对应的值。

场景

两个结构相同的对象,要将它们具备相同key的数据合并,一般的方法会导致后面覆盖前面,所以需要特殊处理。
用一个简单的demo数据作为例子。

let obj1 = {
name: [{ text: “王妃1” }, { text: “王妃2” }],
age: [{ num: “12” }, { num: “13” }],
};
let obj2 = {
name: [{ text: “秦王3” }, { text: “秦王4” }],
age: [{ num: “45” }, { num: “46” }],
};

要转换为下面这种:

{
name: [ { text: ‘王妃1’ }, { text: ‘王妃2’ }, { text: ‘秦王3’ }, { text: ‘秦王4’ } ],
age: [ { num: ‘12’ }, { num: ‘13’ }, { num: ‘12’ }, { num: ‘46’ } ]
}

代码实现:

let obj1Keys = Object.keys(obj1);
let obj2Keys = Object.keys(obj2);
let newObj = {};
obj1Keys.forEach((item) => {
if (!newObj[item]) {
newObj[item] = [];
}
newObj[item] = newObj[item].concat(obj1[item]);
});
obj2Keys.forEach((item) => {
if (!newObj[item]) {
newObj[item] = [];
}
newObj[item] = newObj[item].concat(obj2[item]);
});
console.log(newObj)

### JavaScript合并相同对象的方法 在 JavaScript 中,可以通过多种方式实现对象合并操作。以下是几种常见的方法及其适用场景: #### 1. **使用 `Object.assign`** `Object.assign` 是一种简单而有效的方式,用于浅拷贝多个源对象到目标对象中。如果存在同名键,则后面的值会覆盖前面的值。 ```javascript const obj1 = { a: 1, b: 2 }; const obj2 = { b: 3, c: 4 }; const mergedObj = Object.assign({}, obj1, obj2); console.log(mergedObj); // 输出: { a: 1, b: 3, c: 4 } ``` 这种方法适用于简单的对象合并需求[^1]。 --- #### 2. **通过扩展运算符 (`...`)** 现代 JavaScript 提供了扩展运算符来简化对象合并的操作。它同样执行的是浅拷贝,并允许更灵活的语法结构。 ```javascript const obj1 = { a: 1, b: 2 }; const obj2 = { b: 3, c: 4 }; const mergedObj = { ...obj1, ...obj2 }; console.log(mergedObj); // 输出: { a: 1, b: 3, c: 4 } ``` 这种方式更加直观易于阅读。 --- #### 3. **针对数组中的对象进行合并** 当需要处理的对象位于数组中时,可以利用 `reduce` 和其他辅助逻辑完成特定条件下的属性合并。例如,对于具有相同字段的对象,可将其某些属性(如 `ids`)聚合在一起。 ```javascript const arr = [ { value: 'A', id: 1 }, { value: 'B', id: 2 }, { value: 'A', id: 3 } ]; const mergedArr = arr.reduce((acc, obj) => { const foundObj = acc.find(item => item.value === obj.value); if (foundObj) { foundObj.ids.push(obj.id); // 将相同属性的 id 添加到 ids 数组中 } else { acc.push({ value: obj.value, ids: [obj.id] }); // 创建新的对象 } return acc; }, []); console.log(mergedArr); // 输出: [{ value: 'A', ids: [1, 3] }, { value: 'B', ids: [2] }] ``` 此方法特别适合于复杂数据结构合并需求[^2]^。 --- #### 4. **自定义合并逻辑** 有时默认的行为可能无法满足具体业务需求,此时可通过编写自定义函数来控制合并过程。例如,在遇到重复键时保留所有值而是直接覆盖。 ```javascript function mergeObjects(...objects) { return objects.reduce((result, current) => { for (let key in current) { result[key] = Array.isArray(result[key]) ? [...new Set([...(result[key] || []), ...(Array.isArray(current[key]) ? current[key] : [current[key]])])] : result[key] !== undefined && typeof result[key] === 'object' && typeof current[key] === 'object' ? mergeObjects(result[key], current[key]) : current[key]; } return result; }, {}); } const obj1 = { user: { name: 'Alice', age: 25 }, hobbies: ['reading'] }; const obj2 = { user: { age: 30, city: 'New York' }, hobbies: ['traveling'] }; const deepMergedObj = mergeObjects(obj1, obj2); console.log(deepMergedObj); /* 输出: { user: { name: 'Alice', age: 30, city: 'New York' }, hobbies: ['reading', 'traveling'] } */ ``` 这种深度合并策略能够更好地适应复杂的嵌套对象结构[^3]。 --- ### 总结 以上介绍了四种主要的 JavaScript 对象合并技术:`Object.assign`、扩展运算符、基于数组的 `reduce` 方法以及自定义深合并逻辑。每种方法都有其独特的应用场景和局限性,开发者应根据实际需求选择合适的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值