如何动态地将对象添加到数组(循环闭包)
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);
}
});
我阅读了几篇关于循环闭包的文章,但仍然不明白如何将其应用于我的情况。
我在 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);
}
});