如何在TypeScript中统计字符串数组中各字符串的出现次数?
如何统计字符串数组元素出现次数并返回指定格式的对象数组?
需求说明
需要遍历字符串数组,统计每个字符串的出现次数,最终返回包含字符串值和对应次数的对象数组。
输入数组
["tony", "tony", "tony", "tony", "kassandra", "tony", "tony", "kassandra"]
期望输出
[{ name: "tony", matches: 6 }, { name: "kassandra", matches: 2 }]
尝试的代码
const names = nameList.map((user) => user.name); const reduce = names.reduce((p, c) => { if (p == c) { return { name: p, matches: `idk what put here yet` }; } return c; });
问题分析
你当前的reduce用法存在两个核心问题:
- 未设置初始累加器值,导致第一次迭代时
p是数组的第一个字符串元素,后续逻辑完全偏离预期; - 累加器设计错误,应该用对象临时存储每个字符串的计数,而非直接返回单个对象或字符串。
正确实现方案
可以分两步完成需求:
- 用
reduce生成记录每个字符串计数的临时对象; - 将临时对象转换为期望格式的数组。
完整代码
const nameList = ["tony", "tony", "tony", "tony", "kassandra", "tony", "tony", "kassandra"]; // 第一步:统计每个名字的出现次数 const countObj = nameList.reduce((acc, currentName) => { // 若当前名字已存在则计数+1,不存在则初始化为1 acc[currentName] = (acc[currentName] || 0) + 1; return acc; }, {}); // 必须传入空对象作为初始累加器 // 第二步:转换为期望的数组格式 const result = Object.entries(countObj).map(([name, matches]) => ({ name, matches })); console.log(result); // 输出:[{ name: "tony", matches: 6 }, { name: "kassandra", matches: 2 }]
代码解释
reduce初始值设为空对象{},确保每次迭代时acc都是存储计数的对象;acc[currentName] = (acc[currentName] || 0) + 1:处理计数逻辑,不存在的名字从0开始计数,已存在则累加;Object.entries(countObj)将计数对象转换为[键, 值]格式的数组,再通过map转换成指定的对象结构。
如果你的nameList是包含user对象的数组(对应原代码里的names = nameList.map(user => user.name)),只需将第一步的nameList替换为names即可:
const nameList = [ { name: "tony" }, { name: "tony" }, // ...其他用户对象 ]; const names = nameList.map(user => user.name); const countObj = names.reduce(/* 同上逻辑 */, {}); // ...后续步骤一致
内容的提问来源于stack exchange,提问作者Vinicius Bernardo
相关产品推荐
相关产品推荐

