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

React从接口获取JSON数据无法在Plotly中使用的问题排查

问题排查:data.map is not a function 原因及解决

核心原因

map 是JavaScript数组专属方法,你调用它时,data 是对象类型而非数组,所以直接报错。

FastAPI返回的Pandas DataFrame默认转字典格式是键值对结构,每个键对应一组数据数组,比如:

{
  "Date": ["2024-01-01", "2024-01-02", "2024-01-03"],
  "Sales": [150, 230, 180]
}

而你可能预期的是对象数组结构(这种才能用map):

[
  {"Date": "2024-01-01", "Sales": 150},
  {"Date": "2024-01-02", "Sales": 230},
  {"Date": "2024-01-03", "Sales": 180}
]

两种可行解决方式

1. 前端适配现有数据结构(无需改后端)

Plotly很多图表类型直接支持传入数组作为x/y轴数据,不需要把数据转成对象数组。比如:

import axios from 'axios';
import Plot from 'react-plotly.js';
import { useState, useEffect } from 'react';

function SalesChart() {
  const [plotData, setPlotData] = useState([]);

  useEffect(() => {
    axios.get('/rawdata')
      .then(res => {
        // 直接提取对象中的数组作为Plotly的数据
        setPlotData([{
          x: res.data.Date,
          y: res.data.Sales,
          type: 'line',
          name: '销售额'
        }]);
      });
  }, []);

  return <Plot data={plotData} layout={{ title: '销售趋势' }} />;
}

2. 后端修改返回格式(输出对象数组)

在FastAPI接口中,把DataFrame转字典时添加orient='records'参数,就能返回你预期的对象数组:

from fastapi import FastAPI
import pandas as pd

app = FastAPI()

@app.get("/rawdata")
def fetch_raw_data():
    # 示例DataFrame
    df = pd.DataFrame({
        "Date": ["2024-01-01", "2024-01-02", "2024-01-03"],
        "Sales": [150, 230, 180]
    })
    # 关键:用orient='records'转成对象数组
    return df.to_dict(orient='records')

这时前端拿到的就是数组,就能正常使用map处理数据(如果需要的话)。

快速验证方法

拿到数据后先打印类型,确认问题:

axios.get('/rawdata').then(res => {
  console.log(typeof res.data); // 输出"object",说明不是数组
  console.log(Array.isArray(res.data)); // 输出false,进一步验证
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:22:45