【问题标题】:Not looping through JSON Object Correctly未正确循环 JSON 对象
【发布时间】:2022-11-11 14:53:54
【问题描述】:

我目前正在尝试制作自己的加密货币监视列表。我正在使用 CoinRankingAPI (https://developers.coinranking.com/api/documentation/coins)。我试图遍历硬币数据以检索价格,但我收到一个错误,指出我试图迭代的对象不是易怒的。源代码将在下面。任何帮助将不胜感激!

const key = 'XXXX';

const url = 'https://api.coinranking.com/v2/coins?' + key;


//Loads Stats Data
function loadPrices() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var coins = JSON.parse(this.responseText);

      // get 'data' key inside response
      var price = coins.data;

      // loop all the teams
      for (var coin of price) {
          // print full name and abbreivation
          document.getElementById("hello").innerHTML += "<br />" + coin["price"] ;
      }
    }
  };
  xhttp.open("GET", url, true);
  xhttp.send();
}

【问题讨论】:

  • 如果它不是可迭代的,那么它就不是一个数组。那是什么?调试时,您在price 中观察到什么值?你期望它有什么价值?为什么?
  • 您可以发布this.responseText 的值吗?
  • 根据 api 文档,我相信您想要 coins.data.coins
  • 请提供您从外部 API 获得的数据的摘录,以便您的问题的读者不必不必要地重复您已经完成的研究和/或可能注册随机网站。由于您是寻求帮助调试,因此您需要提供minimal reproducible example
  • 那么你想循环什么? console.log(price) 调试永远不会受到伤害。

标签: javascript html api


【解决方案1】:

在查看来自提供的链接的预期响应后,它将硬币作为对象返回,其中包含data 值,而该值又包含coins。您在如何构建请求和处理事件方面也存在问题。因此,为了迭代硬币,请尝试以下代码:

xhttp.onreadystatechange = function(e) {
    const req = e.target;

    if (req.readyState == 4 && req.status == 200) {
        const response = JSON.parse(req.response);

        // get 'data' key inside response
        const coins = response.data.coins;

        for (let coin of coins) {
            document.getElementById("hello").innerHTML += "<br />" + coin["price"] ;
        }
    }
}

但同时,您可以使用 fetch API 和 async/await,这将简化您的代码。所以,让我提供一个更好/优化的代码版本:

const key = 'XXXX';
const url = 'https://api.coinranking.com/v2/coins?' + key;

//Loads Stats Data
async function loadPrices() {
    const response = await fetch(url);
    
    const coins = (await response.json()).data.coins;

    const helloElm = document.getElementById("hello");


    // loop all the teams
    let output = '';
    for (var coin of coins) {
        // print full name and abbreivation
        output += "<br />" + coin["price"] ;
    }
    helloElm.innerHTML = output;
}

【讨论】:

  • 不要在循环中使用.innerHTML,因为它会导致在每次迭代时重新解析 DOM。相反,使用循环构建一个 HTML 字符串,在循环完成后,将其设置为 .innerHTML,它只会重建一次 DOM。
猜你喜欢
  • 2011-06-03
  • 2019-09-10
  • 2016-08-09
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
相关资源
最近更新 更多