如何使用Lodash合并具有相同ID的JSON对象集合?
使用Lodash合并同ID的JSON对象
嘿,这个需求用Lodash来处理简直是量身定做!我来给你一步步讲清楚怎么把数组里同ID的对象合并成单个完整对象。
先理清楚需求核心
你手里的数组里分散着同一个ID的多个对象,每个对象只带了一部分属性,我们要把同一个ID的所有属性都整合到一个对象里,最终得到每个ID对应一个完整对象的集合。
第一步:修正原数据的语法问题
先提一句,你给出的原数组里有几个语法小问题(比如字符串没加引号、最后一个ID的笔误),我先修正成合法的JavaScript数组,方便后续处理:
const rawData = [ { id: '1', count: 100 }, { id: '2', count: 50 }, { id: '3', count: 10 }, { id: '1', type: 'A'}, { id: '2', type: 'B' }, { id: '3', type: 'C' }, { id: '1', other: 'no' }, { id: '2', other: 'no'}, { id: '3', other: 'yes'}, { input: 'key', output: 'screen', match: 'no', id: '1' }, { input: 'key', output: 'screen', match: 'yes', id: '4' } // 修正了最后一个ID的笔误 ];
方法一:分组+合并(直观易懂)
这个方法分两步走,先按ID分组,再把每组的对象合并,逻辑非常清晰:
const _ = require('lodash'); // 1. 按ID分组:把同ID的对象归到一起 const groupedById = _.groupBy(rawData, 'id'); // 2. 合并每组内的对象:把同一个ID的所有属性整合到一个对象里 const mergedObj = _.mapValues(groupedById, (group) => _.merge({}, ...group)); // 3. (可选)转成数组形式,和原数据结构对齐 const finalResult = Object.values(mergedObj); console.log(finalResult);
代码解释:
_.groupBy(rawData, 'id'):会生成一个以ID为键、对应ID的对象数组为值的集合,比如{ '1': [{}, {}, ...], '2': [...] }。_.merge({}, ...group):用扩展运算符把分组里的所有对象传给_.merge,它会递归地把所有属性合并到空对象里(用空对象做初始值是为了不修改原数据)。如果有重复属性,后面的对象属性会覆盖前面的(你的例子里没有重复属性,刚好完美整合)。Object.values(mergedObj):把合并后的对象转换成数组,得到和原输入类似的数组结构。
方法二:用reduce一步到位(更简洁)
如果你不想生成中间的分组对象,可以用_.reduce直接遍历数组,逐个合并:
const _ = require('lodash'); const finalResult = _.reduce(rawData, (acc, currentItem) => { // 查找结果数组里是否已有当前ID的对象 const existingItem = acc.find(item => item.id === currentItem.id); if (existingItem) { // 有的话就合并属性到已有对象 _.merge(existingItem, currentItem); } else { // 没有的话就拷贝当前对象到结果数组(用cloneDeep避免修改原数据) acc.push(_.cloneDeep(currentItem)); } return acc; }, []); console.log(finalResult);
注意事项
- 如果你的数据里存在同ID对象有重复属性的情况(比如两个id='1'的对象都有
count),_.merge会默认用后面的属性值覆盖前面的。如果需要特殊处理(比如累加count),可以在合并时单独判断属性名做自定义逻辑。 - 确保你的Lodash版本支持这些方法(
groupBy、mapValues、merge、reduce都是Lodash的基础方法,几乎所有版本都支持)。
内容的提问来源于stack exchange,提问作者Ckappo
相关产品推荐
相关产品推荐

