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
相关产品推荐
相关产品推荐

