2017-01-04 43 views
0

我閱讀關於閉環循環中的幾個帖子,但仍然沒有真正知道如何應用於我的情況。如何動態地添加對象到數組(循環中的閉包)

我有三個在HTML中定義的feed url,使用JavaScript promise可以在不阻塞UI的情況下返回響應。我能夠爲每個Feed URL獲取兩個博客條目數據。現在,每個返回的博客條目都有其發佈日期,我想將它們從最新到最舊排序。但是,當我將對象推到數組時,我一直得到最後一個值。我知道這與閉包有關,因爲我不熟悉閉包,所以我很難解決這個問題。任何幫助非常感謝!

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

回答

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

哈哈我現在感覺很傻。這解決了我的問題。謝謝! –

0

移動var entryObj = {};到您的for循環

相關問題