使用Lodash合并对象时,如何替换同键的数组值?
问题描述
我有两个存在部分相同键但值不同的对象:
const object1 = { name: 'John', age: 23, books: ['book1', 'book2'] }; const object2 = { name: 'John', age: 23, books: ['book3'], city: 'London' };
期望得到的输出是:
const object3 = { name: 'John', age: 23, books: ['book3'], city: 'London' };
但使用Lodash的_.merge方法执行以下代码时:
object3 = _.merge(object1 , object2);
得到的结果却是数组被合并而非替换:
const object3 = { name: 'John', age: 23, books: ['book1','book2','book3'], city: 'London' };
请问如何让books数组被object2中的新数据替换?
解决方案
方法1:使用浅合并直接覆盖
_.merge的特性是递归合并数组元素,若需要直接用后面对象的属性覆盖前面的,可采用浅合并方案:
- 原生扩展运算符:
const object3 = { ...object1, ...object2 };
- 原生
Object.assign:
const object3 = Object.assign({}, object1, object2);
- Lodash的
_.assign:
const object3 = _.assign({}, object1, object2);
以上方法都会直接用object2的books数组覆盖object1的对应属性,不会合并数组元素。
方法2:自定义深层合并逻辑
如果需要保留_.merge对深层对象的合并能力,但遇到数组时直接替换,可使用_.mergeWith自定义合并规则:
const object3 = _.mergeWith({}, object1, object2, (objValue, srcValue) => { // 当源值为数组时,直接返回源值完成替换 if (Array.isArray(srcValue)) { return srcValue; } });
这种方式兼顾了深层对象合并和数组替换的需求。
内容的提问来源于stack exchange,提问作者user10518298
相关产品推荐
相关产品推荐

