如何对对象数组去重并为每个对象新增count计数字段?
对象数组去重并添加计数字段的简便实现
可以通过缓存映射的方式高效实现,一次遍历就能完成去重和计数,时间复杂度为O(n),比嵌套循环的O(n²)更高效。以下是两种常用实现方式:
方法一:使用普通对象作为缓存
// 原始数组 const originalArray = [ { id: 2, name: 'Adventure' }, { id: 6, name: 'Crime' }, { id: 2, name: 'Adventure' }, { id: 3, name: 'Beautiful' }, { id: 7, name: 'Drama' }, { id: 2, name: 'Adventure' } ]; const countMap = {}; originalArray.forEach(item => { // 以id作为唯一标识(如果需要更严格的去重,可以用`${item.id}-${item.name}`作为键) const key = item.id; if (countMap[key]) { countMap[key].count++; } else { // 复制原对象并初始化count为1 countMap[key] = { ...item, count: 1 }; } }); // 将缓存对象的值转为数组,得到最终结果 const resultArray = Object.values(countMap); console.log(resultArray);
方法二:使用Map对象作为缓存
Map的键支持多种类型,比普通对象更灵活:
const originalArray = [ { id: 2, name: 'Adventure' }, { id: 6, name: 'Crime' }, { id: 2, name: 'Adventure' }, { id: 3, name: 'Beautiful' }, { id: 7, name: 'Drama' }, { id: 2, name: 'Adventure' } ]; const countMap = new Map(); originalArray.forEach(item => { const key = item.id; if (countMap.has(key)) { countMap.get(key).count++; } else { countMap.set(key, { ...item, count: 1 }); } }); // 将Map的值转为数组 const resultArray = Array.from(countMap.values()); console.log(resultArray);
两种方法最终都会输出你期望的结果:
[ { id: 2, name: 'Adventure', count: 3 }, { id: 6, name: 'Crime', count: 1 }, { id: 3, name: 'Beautiful', count: 1 }, { id: 7, name: 'Drama', count: 1 } ]
内容的提问来源于stack exchange,提问作者unicorn_surprise
相关产品推荐
相关产品推荐

