JavaScript中重新格式化API返回JSON数据遇阻,求解决方案
解决API响应对象转目标数组格式的问题
嘿,你踩了个很常见的小坑——map是数组专属的方法,不能直接用在对象上!你拿到的API返回data是一个以日期为键的对象,直接调用data.map()自然不会生效,甚至会报错。
咱们一步步来修正这个问题:
正确实现思路
- 先提取对象里的所有日期键:用
Object.keys(data)拿到日期字符串组成的数组 - 遍历这个日期数组,对每个日期取出对应的数值对象,再转换成你想要的结构
- 把字符串类型的价格、成交量转换成数字类型(用
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




