如何优化按fruit匹配累加两对象数组count值并兼容不同长度的代码
实现方案
你原有代码的核心问题是按数组索引位置匹配项,仅当两个数组长度相同、且相同索引位置的fruit字段匹配时才能得到正确结果,一旦数组长度不同、或者fruit匹配的项不在同一索引位置就会出错,同时如果用双重循环匹配的话,数据量较大时时间复杂度会升至O(n*m),性能很差。
推荐使用哈希表(Map/普通对象)实现,整体时间复杂度为O(n+m),n、m分别为两个输入数组的长度,不管数据量多大都能保持很高的执行效率,且完全不依赖数组的长度和项的顺序:
function mergeFruitCount(arr1, arr2) { // 用Map存储fruit对应的累计count,查找效率O(1) const countMap = new Map(); // 遍历第一个数组初始化Map arr1.forEach(item => { countMap.set(item.fruit, item.count); }); // 遍历第二个数组,存在则累加,不存在则新增 arr2.forEach(item => { const currentCount = countMap.get(item.fruit) || 0; countMap.set(item.fruit, currentCount + item.count); }); // 将Map转换为要求的对象数组格式返回 return Array.from(countMap, ([fruit, count]) => ({ fruit, count })); }
测试验证
示例1输入:
const arr1 = [{fruit: 'apple',count: 10}]; const arr2 = [{fruit: 'apple',count: 30},{fruit: 'orange',count: 20}]; console.log(mergeFruitCount(arr1, arr2));
输出:[{fruit: 'apple',count: 40},{fruit: 'orange',count: 20}]
示例2输入:
const arr1 = [{fruit: 'apple',count: 15}]; const arr2 = [{fruit: 'orange',count: 20}]; console.log(mergeFruitCount(arr1, arr2));
输出:[{fruit: 'apple',count: 15},{fruit: 'orange',count: 20}]
兼容旧环境版本
如果需要兼容不支持Map的老旧运行环境,可以替换为普通对象实现,逻辑完全一致:
function mergeFruitCount(arr1, arr2) { const countObj = {}; arr1.forEach(item => { countObj[item.fruit] = item.count; }); arr2.forEach(item => { countObj[item.fruit] = (countObj[item.fruit] || 0) + item.count; }); return Object.entries(countObj).map(([fruit, count]) => ({ fruit, count })); }
内容的提问来源于stack exchange,提问作者John_ny
相关产品推荐
相关产品推荐

