在Angular中用reduce按名称频率排序数组、去重并取前2项
实现步骤与代码
1. 用reduce统计每个name的出现频率
先通过reduce遍历原数组,生成一个记录各name出现次数的对象:
const array = [ { id:1, name:"mike"}, { id:6, name:"mike"}, { id:2, name:"clay"}, { id:3, name:"mike"}, { id:4, name:"henry"}, { id:5, name:"henry"}, ]; // 统计每个name的出现次数 const frequencyMap = array.reduce((acc, item) => { acc[item.name] = (acc[item.name] || 0) + 1; return acc; }, {});
执行后得到频率对象:{ mike: 3, clay: 1, henry: 2 }
2. 转换为数组并按频率排序
把频率对象转成键值对数组,再按出现次数降序排序:
// 转成[name, 次数]格式的数组,按次数从高到低排序 const sortedFrequency = Object.entries(frequencyMap).sort((a, b) => b[1] - a[1]);
排序后结果:[ ['mike', 3], ['henry', 2], ['clay', 1] ]
3. 转换为目标格式并取前2项
将排序后的数组转成仅含name字段的对象数组,最后截取前2项:
// 转成目标格式并提取前2项 const array3 = sortedFrequency.map(([name]) => ({ name })).slice(0, 2);
最终得到:
[ { name: 'mike' }, { name: 'henry' } ]
完整合并代码
如果需要一步完成所有逻辑,可以把代码连写:
const array = [ { id:1, name:"mike"}, { id:6, name:"mike"}, { id:2, name:"clay"}, { id:3, name:"mike"}, { id:4, name:"henry"}, { id:5, name:"henry"}, ]; const array3 = Object.entries( array.reduce((acc, item) => { acc[item.name] = (acc[item.name] || 0) + 1; return acc; }, {}) ) .sort((a, b) => b[1] - a[1]) .map(([name]) => ({ name })) .slice(0, 2); console.log(array3);
内容的提问来源于stack exchange,提问作者at out
相关产品推荐
相关产品推荐

