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

JavaScript数组去重:基于fruit字段统计出现次数并生成新数组

统计数组中fruit字段出现次数并生成去重新数组

给定如下结构的JavaScript数组,需要针对fruit字段统计其出现次数,最终生成去重后的新数组,每个项新增occurrence字段记录对应fruit的出现次数(去重时保留原数组中该fruit首次出现的code值):

原数组

const arr = [
  {'fruit': 'banana', 'code': 3},
  {'fruit': 'orange', 'code': 1},
  {'fruit': 'banana', 'code': 1},
  {'fruit': 'pineapple', 'code': 5}
];

期望结果

const new_arr = [
  {'fruit': 'banana', 'code': 3, 'occurrence': 2},
  {'fruit': 'orange', 'code': 1, 'occurrence': 1},
  {'fruit': 'pineapple', 'code': 5, 'occurrence': 1}
];

实现方案

方案一:高效分步处理(O(n)时间复杂度)

先统计每个fruit的出现次数,再遍历原数组生成去重结果,适合处理大规模数组:

// 1. 统计每个fruit的出现次数
const countMap = arr.reduce((map, item) => {
  map.set(item.fruit, (map.get(item.fruit) || 0) + 1);
  return map;
}, new Map());

// 2. 生成去重数组,保留首次出现的项并添加次数字段
const new_arr = [];
const processedFruits = new Set();

for (const item of arr) {
  if (!processedFruits.has(item.fruit)) {
    processedFruits.add(item.fruit);
    new_arr.push({
      ...item,
      occurrence: countMap.get(item.fruit)
    });
  }
}

console.log(new_arr);

说明:

  • 用Map统计次数,遍历一次数组即可完成统计,时间复杂度O(n)
  • 用Set标记已处理的fruit,确保只保留原数组中该fruit第一次出现的项,避免重复添加

方案二:单reduce一步完成(O(n²)时间复杂度)

如果数组规模较小,可以用一次reduce同时完成统计和结果生成:

const new_arr = arr.reduce(({ result, countMap }, item) => {
  // 更新当前fruit的出现次数
  const currentCount = (countMap.get(item.fruit) || 0) + 1;
  countMap.set(item.fruit, currentCount);

  // 检查结果数组中是否已有该fruit
  const existingItem = result.find(i => i.fruit === item.fruit);
  if (!existingItem) {
    // 首次出现,添加到结果数组
    result.push({ ...item, occurrence: currentCount });
  } else {
    // 已存在,更新次数字段
    existingItem.occurrence = currentCount;
  }

  return { result, countMap };
}, { result: [], countMap: new Map() }).result;

console.log(new_arr);

说明:

  • 该方法在遍历过程中同时维护结果数组和次数统计Map,但find操作会带来额外的O(n)开销,整体时间复杂度为O(n²),适合小规模数组使用

内容的提问来源于stack exchange,提问作者Steve Yonkeu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:45:12