
本文介绍如何用 Lodash 替代手动循环累加,安全、简洁、高性能地合并包含嵌套金钱对象和扁平 items 数组的结构化数据。核心方案是结合 _.mergeWith 实现数值累加合并与 _.concat 高效拼接数组。
本文介绍如何用 lodash 替代手动循环累加,安全、简洁、高性能地合并包含嵌套金钱对象和扁平 items 数组的结构化数据。核心方案是结合 `_.mergewith` 实现数值累加合并与 `_.concat` 高效拼接数组。
在处理由多个同构对象组成的数组(如 [{ items: [...], money: { money1: x, ... } }])时,原始的手动 for 循环虽可运行,但存在三处明显可优化点:
- 可读性差:重复写三次 money.* += 易出错且难以扩展;
- 性能隐患:[...mergedData.items, ...data.items] 每次都创建新数组,时间复杂度 O(n²),大数据量下显著拖慢;
- 扩展性弱:新增 money 字段需同步修改多处代码,违反 DRY 原则。
推荐使用 Lodash 提供的语义化工具函数重构:
✅ 推荐方案:_.mergeWith + _.concat
const _ = require('lodash');
function mergeData(dataArray) {
const mergedData = {
items: [],
money: { money1: 0, money2: 0, money3: 0 }
};
for (const data of dataArray) {
// 对 money 对象做「数值累加」式合并(自定义合并器)
_.mergeWith(mergedData.money, data.money, (objValue, srcValue) =>
typeof objValue === 'number' && typeof srcValue === 'number'
? objValue + srcValue
: undefined // 保持默认浅合并行为(对非数字字段)
);
// 高效拼接 items 数组(内部使用 Array.prototype.push,避免展开运算符开销)
mergedData.items = _.concat(mergedData.items, data.items);
}
return mergedData;
}? 关键优势说明
- _.mergeWith 精准控制合并逻辑:通过自定义迭代器函数,仅对 money 下的数值字段执行累加,其余字段(如有)按默认方式合并,安全且可扩展;
- _.concat 性能优于展开语法:它直接复用原数组内存并批量 push 元素,时间复杂度为 O(m+n),远优于 [...a, ...b] 的 O(m+n) 内存分配 + GC 开销;
- 零侵入式升级:无需修改数据结构,兼容现有 dataArray 格式,且新增 money4 字段只需在初始对象中声明,无需改循环体。
⚠️ 注意事项
- 确保 dataArray 非空;若可能为空,建议前置校验:if (!dataArray?.length) return { items: [], money: { money1: 0, money2: 0, money3: 0 } };
- 若 items 中存在重复对象或需去重,应在 _.concat 后增加 _.uniqBy(mergedData.items, JSON.stringify)(慎用,影响性能);
- 生产环境建议搭配 TypeScript 类型定义,为 money 对象添加接口约束,避免运行时字段访问错误。
该方案兼顾可维护性、性能与健壮性,是处理同类聚合需求的工业级实践。

















