首页 > 解决方案 > 如何在 React 中访问键更改的 JSON 对象

问题描述

我在使用我的 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 行,键的“格式”更改为包括日期和时间。

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

标签: javascriptreactjsalpha-vantage

解决方案


老实说,混合格式的 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]);


推荐阅读