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

使用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和统计对象

代码说明

  1. 用空对象作为reduce的初始值,利用对象键的唯一性快速查找已统计过的id,比遍历数组查找效率更高。
  2. 遍历数组时,若当前id已在对象中,直接累加amount;否则创建新的统计对象存入对象。
  3. 最后用Object.values()提取对象中的所有统计对象,转成你需要的数组格式。

运行这段代码后,就能得到预期结果:

[
  {
    id: "63955a83c1a9a4d5365b686c",
    amount: 1
  },
  {
    id: "63955e3e478e25a859a6e7bb",
    amount: 2
  }
]

内容的提问来源于stack exchange,提问作者Legion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:55:18