1

我在使用我的 React 应用程序时遇到了困难。我正在调用 AlphaVantage API 来获取 RSI 数据。我想获得这样的最新 RSI 值:

    const cryptos = ['AAPL', 'MSFT']
    const arr = []
    for (var i = 0; i < cryptos.length; i++) {
      const cryptoUrl =
        'https://www.alphavantage.co/query?function=RSI&symbol=' +
        cryptos[i] +
        `&interval=weekly&time_period=10&series_type=open&apikey=${apikey}`
      arr.push(axios.get(cryptoUrl))
    }

    Promise.all(arr)
      .then(response =>
        response.map(res =>
          console.log(
            res.data['Technical Analysis: RSI']['2019-08-30'][' RSI'],
            res.data['Meta Data']['1: Symbol']
          )
        )
      )
      .catch(err => console.log(err))
  }

一切都很好,除了

res.data['Technical Analysis: RSI']['2019-08-30'][' RSI'],

我正在尝试访问最新的 RSI 值,但是,最新值的时间总是在变化。我不知道如何得到它。

JSON 看起来像这样: 在此处输入图像描述

请注意屏幕截图的第 15 行,键的“格式”更改为包括日期和时间。

谢谢,如果您需要更多信息,请告诉我。

4

4 回答 4

2

老实说,混合格式的 API 设计很糟糕。

不过幸运的是,这两种格式都可以通过简单地将其作为参数传递给new Date().

new Date('2019-08-30')
new Date('2019-09-06 15:21:38')

转换为Date对象后,您可以简单地使用<>符号来比较它们以确定哪个是最新的。

要获得最新的,您可以使用Object.keys()查看所有值,比较它们,然后选择最新的。在下面的示例中,我使用reduce()查找最新的。

const data = {
  'Technical Analysis: RSI': {
    '2019-08-01 16:00:00': {
      a: 1
    },
    '2019-09-01': {
      b: 1
    },
    '2019-08-15': {
      c: 1
    }
  }
};

const newest = Object.keys(data['Technical Analysis: RSI'])
  .reduce((newest, time) => new Date(time) > new Date(newest) ? time : newest, '1980-01-01'); // '1980-01-01' is just an old default value to start with.
  
console.log(newest, data['Technical Analysis: RSI'][newest]);

于 2019-09-06T19:41:51.177 回答
1

由于键是有序的,因此您可以访问它们Object.keys(yourJSON).reduce并找到最新的值。

提取该值并将其返回。这应该让您访问最新的值。

于 2019-09-06T19:37:53.720 回答
1

您还可以Last Refreshed将 API 返回的属性作为“日期”属性传递。这样您始终可以获得最新的更新,而不必摆弄索引或将事物转换为日期对象。

您需要提供您的 API 密钥,但我把它放在一起并且它可以工作..(实际上看起来这与 '123' 作为 API 密钥一起工作 =/ )

https://codepen.io/oze4/pen/JjPMVmy?editors=1010

let lastRefresh = res.data["Meta Data"]["3: Last Refreshed"];
let stockInfo = {
  symbol: res.data["Meta Data"]["1: Symbol"],
  price: res.data["Technical Analysis: RSI"][lastRefresh]["RSI"]
};
于 2019-09-06T20:55:28.997 回答
0

如果最新的值附有时间(例如,它包括日期和时间),而其他值没有,则您始终可以通过正则表达式获取附加到带有时间戳的对象的值。

例如:

let data;
for(let key in res.data['Technical Analysis: RSI']) {
  if(key.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)
    data = res.data['Technical Analysis: RSI'][key]['RSI'];
    break;
}

或者,您可以匹配“:”字符,因为它似乎只在时间存在时出现。

于 2019-09-06T19:50:07.877 回答