如何动态地将对象添加到数组(循环闭包)

How to dynamically add object to array (closure in loop)

我阅读了几篇关于循环闭包的文章,但仍然不明白如何将其应用于我的情况。

我在 HTML 中定义了三个提要 url,并使用 JavaScript 承诺在响应准备就绪时 return 不会阻塞 UI。我能够为每个提要 url 获取两个博客条目数据。现在,每个 returned 博客条目都有其发布日期,我想将它们从最新到最旧排序。但是,当我将对象推送到数组时,我一直在获取最后一个值。我知道这与闭包有关,并且由于我不熟悉闭包,所以我很难解决这个问题。非常感谢任何帮助!

var itemArray = [];
var entryObj = {};

promise.then(function (response) {
    var parser = new DOMParser();
    xml = parser.parseFromString(response, "text/xml");
    var items = xml.getElementsByTagName("item");

    for (var x = 0; x < items.length && x < limits; x++) {
       title = items[x].getElementsByTagName("title")[0].innerHTML;
       link = items[x].getElementsByTagName("link")[0].innerHTML;
       pubDate = items[x].getElementsByTagName("pubDate")[0].innerHTML;
       creator = items[x].getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "creator")[0].innerHTML;

       entryObj.title = title;
       entryObj.link = link;
       entryObj.pubDate = pubDate;
       entryObj.creator = creator;

       itemArray.push(entryObj);

       // output: all 6 objects contain last value
       console.log(itemArray);
    }
});

var entryObj = {}; 移动到您的 for 循环中

简而言之:将对象创建移动到循环中。

这与关闭无关。问题是,你推的是同一个物体。 您需要推送一个新对象。所以在 for 循环中创建对象。这样每次你得到一个新对象,它就会被推送到数组中。

代码-

var itemArray = [];

promise.then(function (response) {
    var parser = new DOMParser();
    xml = parser.parseFromString(response, "text/xml");
    var items = xml.getElementsByTagName("item");

    for (var x = 0; x < items.length && x < limits; x++) {
       var entryObj = {};

       title = items[x].getElementsByTagName("title")[0].innerHTML;
       link = items[x].getElementsByTagName("link")[0].innerHTML;
       pubDate = items[x].getElementsByTagName("pubDate")[0].innerHTML;
       creator = items[x].getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "creator")[0].innerHTML;

       entryObj.title = title;
       entryObj.link = link;
       entryObj.pubDate = pubDate;
       entryObj.creator = creator;

       itemArray.push(entryObj);

       // output: Now all values are unique
       console.log(itemArray);
    }
});