You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个对象,重复键时优先保留指定对象的数组内容?

问题描述

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:13:19