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

React Hooks处理API返回数据baseSymbol去重及重渲染问题

解决React Hooks获取API数据后去重并触发重渲染的问题

这里给你两种实用的去重方案,按需选择即可:

方案一:仅提取唯一的baseSymbol字符串数组

如果只需要所有不重复的baseSymbol值(比如用于下拉选项的标签),可以这么处理:

const URL = "https://api.coincap.io/v2/markets/";
const [cryptoOptions, setCryptoOptions] = useState([]);

useEffect(() => {
    fetch(URL)
      .then((res) => res.json())
      .then((data) => {
        // 利用Set的自动去重特性处理baseSymbol
        const uniqueBaseSymbols = [...new Set(data.data.map(item => item.baseSymbol))];
        setCryptoOptions(uniqueBaseSymbols);
      });
  }, []);

方案二:保留完整对象,每个baseSymbol仅存一条数据

如果需要保留每条数据的完整信息,但每个baseSymbol只保留首次(或末次)出现的条目,用Map处理更稳妥:

const URL = "https://api.coincap.io/v2/markets/";
const [cryptoOptions, setCryptoOptions] = useState([]);

useEffect(() => {
    fetch(URL)
      .then((res) => res.json())
      .then((data) => {
        // 借助Map的key唯一性去重,这里保留第一个出现的baseSymbol对应条目
        const uniqueMap = new Map();
        data.data.forEach(item => {
          if (!uniqueMap.has(item.baseSymbol)) {
            uniqueMap.set(item.baseSymbol, item);
          }
        });
        // 将Map转换为数组格式
        const uniqueData = Array.from(uniqueMap.values());
        setCryptoOptions(uniqueData);
      });
  }, []);

关于重渲染的说明

只要你调用setCryptoOptions传入新的数组引用(比如上面的[...new Set(...)]或Array.from(uniqueMap.values())都是全新数组),React会自动检测到state变化,触发组件重渲染,不需要额外操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:06:48