如何合并两个对象,重复键时优先保留指定对象的数组内容?
问题描述
通过Lodash的groupBy方法创建了两个分组对象:
const prevGroupedData = { '01/04/2000': [{data: 1}, {data: 2}, {data: 3}], '02/04/2000': [{data: 1}, {data: 2}] } const groupedData = { '02/04/2000': [{data: 3}, {data: 4}], '03/04/2000': [{data: 1}] }
希望合并这两个对象时,让prevGroupedData的内容优先——重复键对应的数组是prev的内容在前,再追加新对象的内容,得到如下结果:
const result = { '01/04/2000': [{data: 1}, {data: 2}, {data: 3}], '02/04/2000': [{data: 1}, {data: 2}, {data: 3}, {data: 4}], '03/04/2000': [{data: 1}] }
而非数组顺序反转的结果:
const result = { '01/04/2000': [{data: 1}, {data: 2}, {data: 3}], '02/04/2000': [{data: 3}, {data: 4}, {data: 1}, {data: 2}], '03/04/2000': [{data: 1}] }
尝试使用Lodash的merge方法得到的是后者,请问如何实现让prevGroupedData在重复键时拥有更高优先级?
解决方案
方法1:使用Lodash的mergeWith自定义合并逻辑
mergeWith允许指定自定义合并函数,针对数组类型的属性,手动控制拼接顺序,让prev的数组在前、新数组在后:
const _ = require('lodash'); const prevGroupedData = { '01/04/2000': [{data: 1}, {data: 2}, {data: 3}], '02/04/2000': [{data: 1}, {data: 2}] }; const groupedData = { '02/04/2000': [{data: 3}, {data: 4}], '03/04/2000': [{data: 1}] }; const result = _.mergeWith({}, prevGroupedData, groupedData, (objValue, srcValue) => { // 处理数组时,将prev的数组与新数组合并,保持prev在前的顺序 if (_.isArray(objValue)) { return objValue.concat(srcValue); } }); console.log(result);
方法2:手动遍历合并(无需Lodash)
如果不想依赖Lodash,可通过对象扩展和遍历实现需求:
const prevGroupedData = { '01/04/2000': [{data: 1}, {data: 2}, {data: 3}], '02/04/2000': [{data: 1}, {data: 2}] }; const groupedData = { '02/04/2000': [{data: 3}, {data: 4}], '03/04/2000': [{data: 1}] }; // 先复制prev的所有内容 const result = {...prevGroupedData}; // 遍历新对象的键值对 for (const key in groupedData) { if (result[key]) { // 键已存在,拼接数组(prev在前) result[key] = result[key].concat(groupedData[key]); } else { // 键不存在,直接添加新内容 result[key] = groupedData[key]; } } console.log(result);
内容的提问来源于stack exchange,提问作者lamsmallsmall
相关产品推荐
相关产品推荐

