【问题标题】:Restructure JSON format in React Native在 React Native 中重构 JSON 格式
【发布时间】:2019-07-11 16:35:54
【问题描述】:

我从汇率 API 获得了 JSON 数据,但是当我尝试在 flatlist 中显示它时出现错误:Invariant violation tried to get frame for out of range index nan 然后我意识到这不是我想要的 JSON 格式。数据是:

{  
"rates":{  
  "CAD":0.1669423548,
  "HKD":1.0,
  "PLN":0.4835606816
},
"base":"EUR",
"date":"2019-07-11"
}

我想要的样子

{  
"rates":[  
  {  
     "currency":"hkd",
     "rate":"1",
     "base":"EUR",
     "date":"2019-07-11"
  },
     {  
     "currency":"CAD",
     "rate":"0.1669423548",
     "base":"EUR",
     "date":"2019-07-11"
  },
   {  
     "currency":"PLN",
     "rate":"0.4835606816",
     "base":"EUR",
     "date":"2019-07-11"
  },
]
}

这就是我获取数据的方式

async _getRateData() {

const response = await fetch('https://api.exchangeratesapi.io/latest?base=EUR');
const json = await response.json();

this.setState({
  loading: false,
  dataSource: json.base,
  rates: json.rates,
  date: json.date,
  base: json.base,
})
 }

我是原生反应新手,我不知道该怎么做

【问题讨论】:

    标签: json reactjs react-native


    【解决方案1】:

    您可以将您的 _getRateData() 方法更新为:

    async _getRateData() {
    
      const response = await fetch('https://api.exchangeratesapi.io/latest?base=EUR');
      const json = await response.json();
    
      // setting up data object from API endpoint to work with
      const data = {
        rates: json.rates,
        date: json.date,
        base: json.base,
      }
    
      // data transformation
      const newData = {
        // Object.keys method return array of all keys in rates obejct
        rates: Object.keys(data.rates).map((currency, idx) => {
          // then with map function you can map all keys
          // and construct your own data structure
          return {
            currency, // first element currency (the same as currency: currency, es6 shortcode)
            rate: data.rates[currency], // accessing rates element by key
            base: data.base, // adding rest of the data
            date: data.date
          };
        })
      };
    
      // setting data to state
      this.setState({
        loading: false,
        dataSource: json.base,
        rates: newData.rates // set to rates only array
      })
    
    }
    

    简单数据演示:https://codesandbox.io/s/vibrant-carson-d5idp

    【讨论】:

    • 我们通常不会为海报编写代码,我们会修复他们的代码。教他们钓鱼。至少,给它一些解释
    • @Janiis 谢谢你的代码很清晰,这让我很容易学习,但添加一些解释会很棒!
    • @Rachellllls 在代码中添加了 cmets,以便您更好地了解其工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多