优化对象与数组合并循环代码(支持Lodash实现)
优化合并对象数组的JavaScript代码(基于Lodash)
优化点说明
- items合并性能优化:原代码中
mergedData.items = [...mergedData.items, ...data.items]每次循环都会创建新数组,大数据量下内存开销大、性能差。改用push(...data.items)直接在原有数组上追加元素,时间复杂度从O(n²)降至O(n)。 - 代码简洁性优化:用Lodash的
_.reduce和_.mergeWith替代重复的money属性累加逻辑,减少冗余代码。
优化后的实现
private mergeData(dataArray) { return _.reduce(dataArray, (acc, curr) => { // 累加money对象的所有数值属性 acc.money = _.mergeWith(acc.money, curr.money, (prev, currVal) => prev + currVal); // 高效合并items数组 acc.items.push(...curr.items); return acc; }, { items: [], money: { money1: 0, money2: 0, money3: 0 } }); }
另一种逻辑拆分的写法
如果希望代码逻辑拆分更清晰,可以分开处理money和items:
private mergeData(dataArray) { // 合并并累加money属性 const mergedMoney = _.mergeWith( { money1: 0, money2: 0, money3: 0 }, ...dataArray.map(item => item.money), (a, b) => a + b ); // 合并items数组(高性能方式) const mergedItems = []; _.forEach(dataArray, item => mergedItems.push(...item.items)); return { items: mergedItems, money: mergedMoney }; }
关键细节说明
_.mergeWith:通过自定义合并规则,对money对象的每个属性执行累加操作,避免手动逐个属性相加的冗余代码。push(...curr.items):直接在已有数组上追加元素,避免频繁创建新数组,大幅提升大数据量场景下的性能。- 若
items数组的元素是需要去重的键值对对象,可额外使用_.uniqBy处理,比如mergedItems = _.uniqBy(mergedItems, 'key')(根据实际键名调整)。
内容的提问来源于stack exchange,提问作者adame21
相关产品推荐
相关产品推荐

