基于公共键合并二维对象数组并求和basecount的优化方法
优化二维对象数组按campaign_name累加basecount的实现方式
问题描述
原始二维对象数组:
[ [ { basecount: 343, campaign_name: '1.Stay_Connected_Plus:SP_JCA' }, { basecount: 342, campaign_name: '1.Stay_Connected_Plus:JP_JCA' } ], [ { basecount: 102, campaign_name: '1.Stay_Connected_Plus:SP_JCA' }, { basecount: 102, campaign_name: '1.Stay_Connected_Plus:PP_JCA' } ] ]
期望输出:
[ { basecount: 445, campaign_name: '1.Stay_Connected_Plus:SP_JCA' }, { basecount: 342, campaign_name: '1.Stay_Connected_Plus:JP_JCA' }, { basecount: 102, campaign_name: '1.Stay_Connected_Plus:PP_JCA' } ]
核心需求:当campaign_name相同时,累加对应的basecount;不同则保留原对象。已通过嵌套遍历、匹配campaign_name求和的方式实现,想寻求更高效的优化方案。
优化实现方案
可以利用对象映射+数组扁平化的方式实现,时间复杂度为O(n)(n为所有对象的总数),比嵌套遍历的O(n²)更高效:
const originalArray = [ [ { basecount: 343, campaign_name: '1.Stay_Connected_Plus:SP_JCA' }, { basecount: 342, campaign_name: '1.Stay_Connected_Plus:JP_JCA' } ], [ { basecount: 102, campaign_name: '1.Stay_Connected_Plus:SP_JCA' }, { basecount: 102, campaign_name: '1.Stay_Connected_Plus:PP_JCA' } ] ]; // 1. 扁平化二维数组为一维 const flatArray = originalArray.flat(); // 2. 用对象做映射,key为campaign_name,value为累加后的对象 const map = {}; flatArray.forEach(item => { if (map[item.campaign_name]) { map[item.campaign_name].basecount += item.basecount; } else { map[item.campaign_name] = {...item}; // 浅拷贝原对象,避免修改原始数据 } }); // 3. 将映射对象的值转为数组,得到最终结果 const result = Object.values(map); console.log(result);
方案优势
- 扁平化数组后只需一次遍历即可完成累加,数据量越大,效率优势越明显;
- 用
campaign_name作为键值,匹配过程是O(1)的哈希查找,避免嵌套遍历中的重复匹配; - 浅拷贝原对象,不会修改原始数组的数据,保证数据独立性。
也可以用Array.reduce()简化写法,逻辑和上面一致:
const result = originalArray.flat().reduce((acc, curr) => { acc[curr.campaign_name] = acc[curr.campaign_name] ? { ...curr, basecount: acc[curr.campaign_name].basecount + curr.basecount } : { ...curr }; return acc; }, {}); console.log(Object.values(result));
内容的提问来源于stack exchange,提问作者Atul Kumar
相关产品推荐
相关产品推荐

