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

React中如何通过setState统计数组元素的出现次数?

解决数字出现次数统计的状态更新问题

先指出你代码里的两个问题:

  1. 初始状态没必要用数组包裹对象:你需要的是一个统计对象,直接把useState的初始值设为对象即可,不需要外层数组。
  2. 不能用map循环调用setGroupedEdition:setState是异步操作,循环里每次调用都会基于旧的状态值更新,最终只会得到最后一个元素的统计结果,而且会触发多次不必要的组件重渲染。

正确实现步骤:

1. 修正初始状态

把useState的初始值改成纯对象:

const edition = [6, 6, 6, 1, 1, 2];
const [groupedEdition, setGroupedEdition] = useState({
  "0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0
});

2. 编写统计并更新状态的逻辑

推荐用useEffect监听edition数组的变化,一次性计算出统计结果后更新状态,这里提供两种写法:

写法一:用forEach遍历累加
import { useState, useEffect } from 'react';

// ...其他组件代码
useEffect(() => {
  // 复制初始统计对象,避免直接修改状态
  const countResult = {...groupedEdition};
  // 遍历数组累加对应数字的次数
  edition.forEach(num => {
    countResult[num]++;
  });
  // 一次性更新状态
  setGroupedEdition(countResult);
}, [edition]); // 当edition数组变化时重新计算
写法二:用reduce更简洁
import { useState, useEffect } from 'react';

// ...其他组件代码
useEffect(() => {
  const countResult = edition.reduce((acc, num) => {
    acc[num]++;
    return acc;
  }, {...groupedEdition}); // 以初始统计对象为累加器起点
  setGroupedEdition(countResult);
}, [edition]);

注意:

你给出的期望结果里"5": 1,但原数组edition = [6,6,6,1,1,2]里并没有5,所以实际运行后"5"的值应该是0,这点可能是你笔误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:35:18