You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:57:00