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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:27:05