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

React+TypeScript如何将datalist转换为指定格式的对象数组

实现方案

你原来的逻辑循环层级写反了,最终输出的数组长度和categoryName的键数量一致,所以需要把遍历categoryName放在外层,再为每个分类去datalist中提取对应数值组成数组即可。

核心转换逻辑

const result = Object.keys(categoryName).map((categoryKey) => ({
  label: categoryName[categoryKey],
  data: datalist.map((item) => item[categoryKey]),
  stack: 1
}))

完整修改后的组件代码

import "./styles.css";
import { useMemo } from "react";

// 定义输出项的类型,保证TS类型安全
interface FormattedDataItem {
  label: string;
  data: number[];
  stack: number;
}

const App = () => {
  const categoryName: { [key: string]: string } = {
    group_a: "groupTypeA",
    group_b: "groupTypeB",
    group_c: "groupTypeC"
  };

  const datalist = [
    {
      group_a: 10,
      group_b: 9,
      group_c: 8,
      group_d: 7
    },
    {
      group_a: 10,
      group_b: 9,
      group_c: 8,
      group_d: 7
    },
    {
      group_a: 10,
      group_b: 9,
      group_c: 8,
      group_d: 7
    }
  ];

  // 用useMemo缓存计算结果,避免重复渲染时重复计算
  const formattedData: FormattedDataItem[] = useMemo(() => {
    return Object.keys(categoryName).map((categoryKey) => ({
      label: categoryName[categoryKey],
      data: datalist.map((item) => item[categoryKey]),
      stack: 1
    }))
  }, [datalist, categoryName])

  // 打印验证结果
  console.log(formattedData)

  return (
    <div className="App">
    </div>
  );
};

export default App;

输出验证

转换后的formattedData和你要求的目标格式完全一致:

const data = [
  { label: "groupTypeA", data: [10,10,10], stack: 1 },
  { label: "groupTypeB", data: [9,9,9], stack: 1 },
  { label: "groupTypeC", data: [8,8,8], stack: 1 },
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:03