You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript中重新格式化API返回JSON数据遇阻,求解决方案

解决API响应对象转目标数组格式的问题

嘿,你踩了个很常见的小坑——map是数组专属的方法,不能直接用在对象上!你拿到的API返回data是一个以日期为键的对象,直接调用data.map()自然不会生效,甚至会报错。

咱们一步步来修正这个问题:

正确实现思路

  1. 先提取对象里的所有日期键:用Object.keys(data)拿到日期字符串组成的数组
  2. 遍历这个日期数组,对每个日期取出对应的数值对象,再转换成你想要的结构
  3. 把字符串类型的价格、成交量转换成数字类型(用parseFloat处理带小数的价格,用Number处理整数成交量更合适)

完整测试代码

var data = { 
  '2018-03-13': { 
    '1. open': '32.8500', 
    '2. high': '33.3600', 
    '3. low': '32.8500', 
    '4. close': '33.1400', 
    '5. volume': '834894' 
  },
  '2018-03-14': { 
    '1. open': '33.2000', 
    '2. high': '33.5000', 
    '3. low': '33.0000', 
    '4. close': '33.4000', 
    '5. volume': '756200' 
  }
};

// 正确的转换逻辑
const formattedData = Object.keys(data).map(date => {
  const item = data[date];
  return {
    date: date,
    open: parseFloat(item['1. open']),
    high: parseFloat(item['2. high']),
    low: parseFloat(item['3. low']),
    close: parseFloat(item['4. close']),
    volume: Number(item['5. volume'])
  };
});

console.log(formattedData);

集成到你的API调用中

把转换逻辑放到then回调里即可:

main.data.daily(symbol, 'main', 'json').then(data => {
  // 注意:如果API返回的结构是外层带data键(如你贴的响应示例),要先取内层对象
  const rawData = data.data || data;
  
  const formattedData = Object.keys(rawData).map(date => {
    const item = rawData[date];
    return {
      date: date,
      open: parseFloat(item['1. open']),
      high: parseFloat(item['2. high']),
      low: parseFloat(item['3. low']),
      close: parseFloat(item['4. close']),
      volume: Number(item['5. volume'])
    };
  });
  
  // 这里用formattedData做后续业务处理
  console.log(formattedData);
});

小补充

  • 如果担心转换数字时出现异常,可以加个默认值,比如parseFloat(item['1. open']) || 0
  • 如果你需要按日期排序数组,可以在转换后加一行:formattedData.sort((a,b) => new Date(a.date) - new Date(b.date))

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

火山引擎 最新活动