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

如何在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用法存在两个核心问题:

  1. 未设置初始累加器值,导致第一次迭代时p是数组的第一个字符串元素,后续逻辑完全偏离预期;
  2. 累加器设计错误,应该用对象临时存储每个字符串的计数,而非直接返回单个对象或字符串。

正确实现方案

可以分两步完成需求:

  1. 用reduce生成记录每个字符串计数的临时对象;
  2. 将临时对象转换为期望格式的数组。

完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:35:03