如何将对象数组转换为新对象数组并统计Name字段出现次数
JavaScript 按Name统计出现次数的实现思路
给定输入数组:
let inputArray=[ {Id: '1', Name: 'Ani'}, {Id: '2', Name: 'George'}, {Id: '4', Name: 'George'}, {Id: '5', Name: 'Ani'}];
需要转换成按Name分组、统计出现次数的数组(示例中包含原数组没有的Henry,可按需添加):
let result=[ { Name: 'Ani', count:2}, { Name: 'George',count:2}, { Name: 'Henry',count:1}];
给你几个实用的实现方法:
方法一:用reduce统计+对象转数组
核心是先用reduce遍历数组,生成一个以Name为键、次数为值的统计对象,再把这个对象转换成目标格式的数组。如果要加原数组没有的条目,直接push即可。
let inputArray = [ {Id: '1', Name: 'Ani'}, {Id: '2', Name: 'George'}, {Id: '4', Name: 'George'}, {Id: '5', Name: 'Ani'} ]; // 统计每个Name的出现次数 const countMap = inputArray.reduce((acc, item) => { acc[item.Name] = (acc[item.Name] || 0) + 1; return acc; }, {}); // 转换为目标数组 let result = Object.entries(countMap).map(([Name, count]) => ({ Name, count })); // 手动添加原数组没有的Henry result.push({ Name: 'Henry', count: 1 }); console.log(result);
方法二:用Map统计(更直观)
用ES6的Map来存储Name和对应的次数,遍历数组更新计数,最后把Map转换成目标数组。
let inputArray = [ {Id: '1', Name: 'Ani'}, {Id: '2', Name: 'George'}, {Id: '4', Name: 'George'}, {Id: '5', Name: 'Ani'} ]; const nameMap = new Map(); // 遍历更新计数 inputArray.forEach(item => { const currentCount = nameMap.get(item.Name) || 0; nameMap.set(item.Name, currentCount + 1); }); // 转换为目标数组 let result = Array.from(nameMap, ([Name, count]) => ({ Name, count })); // 添加Henry条目 result.push({ Name: 'Henry', count: 1 }); console.log(result);
核心思路总结
- 先完成统计计数:不管用对象还是Map,本质都是遍历输入数组,记录每个Name出现的次数;
- 格式转换:把统计好的键值对转换成要求的
{Name: '', count: number}格式的对象数组; - 补充额外条目:如果需要加入原数组没有的Name(比如示例中的Henry),直接往结果数组里push对应的对象就行。
内容的提问来源于stack exchange,提问作者Lidiq
相关产品推荐
相关产品推荐

