通过API数组进行迭代,data.forEach不是函数

时间:2019-05-03 13:54:32

标签: javascript json ajax api iteration

昨天我试图获得一些帮助,但是我没有真正涉及到很多问题,也没有给出很多代码,但是在这里我们再次尝试。请不要因为我对编码的理解不够而开除我:)。

我正在尝试遍历jSON中的API GET响应。但是正如您在代码中看到的那样,我陷入了forEach循环中。这是错误消息:未捕获(按承诺)TypeError:data.forEach不是函数 在index.js:26

这是完整的javascript代码:

"use strict";

window.addEventListener('load', () => {

  let form = document.getElementById('search-form');
  let content = document.getElementById('content');
  let searchField = document.getElementById('search');

  form.addEventListener('submit', event => {
    event.preventDefault();
    search(searchField.value);
  });
});

/**
 * Makes a request to https://restcountries.eu/rest/v2/name/{query} .
 * @param {string} query The user’s search query
 * @param {HTMLElement} content The <tbody> element that the result will be printed to
*/

function search(query, container) {
  window.fetch('https://newsapi.org/v2/top-headlines?country=' + encodeURIComponent(query) + "&apiKey=blabla")
    .then(response => response.json())
    .then(data => {
      console.log(data);
      data.forEach(item => {
        createArticlesHolders(item, container);
      })
    });
}

function createArticlesHolders(newsData, container) {

  let card = document.createElement('div');
  card.className= "card";
  card.style.width = "20rem";
  content.appendChild(card);

  let cardTitle = createElement("h5");
  cardTitle.className = "card-title";
  cardTitle.textContent = newsData.title;
  card.appendChild(cardTitle);

  let cardImg = document.createElement("img");
  cardImg.className = "card-img-top";
  cardImg.setAttribute('src', newsData.urlToImage);
  card.appendChild(cardImg);

}

$('#myModal').on('shown.bs.modal', function () {
  $('#myInput').trigger('focus')
})

我想做的是,当某人在搜索框中搜索国家/地区代码时,将会出现该国家/地区的一些热门新闻。然后,该代码应该使用引导类创建元素。

这是console.log(data);

Image

3 个答案:

答案 0 :(得分:1)

您无法使用json遍历forEach。为此,您可以使用Object.keys()for...in循环-在顶级键上进行迭代,即:

...
keys = Object.keys(data);
keys.forEach(key => {
    createArticlesHolders(data[key], container);
})
...

...
for (let key in data) {
    createArticlesHolders(data[key], container);
}
...

编辑:
不知道datajson还是array-如果是第二个,显然您应该以前遍历它。

答案 1 :(得分:0)

数据是没有forEach方法的常规对象。您应该遍历对象的属性。

let data = {
  "articles": [
    {
      "author": "Author 1"
    },
    {
      "author": "Author 2"
    },
    {
      "author": "Author 3"
    }
  ]
}

data.articles.forEach((obj) => {
  console.log(obj.author)
});

答案 2 :(得分:0)

您应包括console.log(data)的印刷品。但是无论如何,只要阅读错误消息,data.forEach都不是函数;因此,data不是数组。