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

时间:2017-01-04 07:27:48

标签: javascript promise closures frontend

我在循环中阅读了关于闭包的几篇帖子,但仍然没有真正了解如何应用于我的情况。

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

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);
    }
});

2 个答案:

答案 0 :(得分:1)

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

这与封闭无关。问题是,你正在推动同一个对象。 您需要推送一个新对象。所以在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);
    }
});

答案 1 :(得分:0)

var entryObj = {};移至 for循环