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

React中如何将axios返回的对象数组转换为嵌套结构适配react-table

数据转换实现

你之前写的转换方法混淆了对象和数组的处理逻辑:你拿到的data是对象数组,不是单个对象,Object.entries(data)拿到的是数组的索引和值的键值对,不是你要的对象字段,所以达不到预期效果。

正确的实现逻辑是直接用数组的map方法遍历每一项,按需拆解字段组装成目标结构即可,不需要用Object.fromEntries(这个API是用来把键值对数组转成单个对象的,不适合你的场景),代码示例如下:

// 进度状态枚举,和你需求里的配置一致
const PROGRESS_STATUS = {
  success: "The system reports success",
  error: "Has start and end date, but not processed",
  inactive: "No start date",
  inProgress: "Has start date, processing hasn't finished"
}

// 单条数据转换函数
const transformRawItem = (rawItem) => {
  // 先把要放到嵌套结构里的字段摘出来,剩下的通用字段保留在根层级
  const { status, total, processed, username, fullname, email, ...restBaseFields } = rawItem
  return {
    ...restBaseFields,
    // 组装progress嵌套对象
    progress: {
      total,
      processed,
      status: PROGRESS_STATUS
    },
    // 组装user嵌套对象
    user: {
      username,
      fullname,
      email
    }
  }
}

然后修改你的请求逻辑,拿到接口返回数据后先做转换再存到state:

const [ data, setData ] = useState([]);
const [ loadingData, setLoadingData ] = useState(true);

useEffect(() => {
    async function getData() {
        try {
          const resp = await axios.get(`${API_URL}${1}`, options)
          const rawData = resp.data.DATA;
          // 遍历数组完成全量转换
          const transformedData = rawData.map(item => transformRawItem(item))
          setData(transformedData);
        } catch (err) {
          console.error('数据请求失败', err)
        } finally {
          setLoadingData(false);
        }
    }
    if(loadingData) {
        getData();
    }
// 补全依赖项避免重复请求
}, [loadingData, options])

react-table 列配置优化

有两种常用方案可以满足你的传值需求:

方案1:直接绑定转换后的嵌套字段

如果要单独展示每个嵌套字段,accessor直接写嵌套路径即可:

{
    Header: '总任务数',
    accessor: 'progress.total',
    Cell: ({ cell: {value}}) => <ProgressTracker values={value}/>
},
{
     Header: '已处理数',
     accessor: 'progress.processed',
     Cell: ({ cell: {value}})=><ProgressTracker values={value}/>
},
{
  Header: '用户邮箱',
  accessor: 'user.email'
}

方案2:单个单元格传入整行多字段

如果需要在同一个单元格组件里拿到多字段值(比如把进度条和状态都放在同一个单元格展示),可以直接通过row.original取到当前行的完整数据:

{
  Header: '处理进度',
  Cell: ({ row }) => {
    // row.original就是当前行的完整转换后数据
    const { total, processed, status } = row.original.progress
    return <ProgressTracker total={total} processed={processed} status={status}/>
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:39:02