使用reduce统计字符串数组重复元素数量的问题求助
问题分析与修正
你的代码主要存在几个逻辑错误:
- 错误使用数组作为reduce的初始容器,却给数组添加字符串类型的键(比如
prev["63955a83c1a9a4d5365b686c"]),数组是按数字索引存储元素的,这种操作只会给数组对象额外挂载属性,无法生成目标格式的结果。 prev[curr]被赋值为数组而非单个统计对象,后续prev[curr][curr.amount]逻辑完全错误——curr是字符串,curr.amount等于undefined,相当于给数组的undefined索引位置赋值,完全偏离了统计次数的需求。
修正后的代码
const arrayOfStrings = ["63955a83c1a9a4d5365b686c", "63955e3e478e25a859a6e7bb", "63955e3e478e25a859a6e7bb"] const result = Object.values(arrayOfStrings.reduce((prev, curr) => { // 检查当前id是否已存在统计对象 if (prev[curr]) { prev[curr].amount += 1; } else { // 不存在则创建新的统计对象,初始次数为1 prev[curr] = { id: curr, amount: 1 }; } return prev; }, {})) // 初始值用空对象,用来快速映射id和统计对象
代码说明
- 用空对象作为reduce的初始值,利用对象键的唯一性快速查找已统计过的id,比遍历数组查找效率更高。
- 遍历数组时,若当前id已在对象中,直接累加
amount;否则创建新的统计对象存入对象。 - 最后用
Object.values()提取对象中的所有统计对象,转成你需要的数组格式。
运行这段代码后,就能得到预期结果:
[ { id: "63955a83c1a9a4d5365b686c", amount: 1 }, { id: "63955e3e478e25a859a6e7bb", amount: 2 } ]
内容的提问来源于stack exchange,提问作者Legion
相关产品推荐
相关产品推荐

