2015-04-01 202 views
0

我有一些代碼:For循環循環太多次

var cart = []; 
var items = []; 
var cart_node = document.querySelectorAll('#tblItineraryModuleStayDetail > tbody > tr'); 
var cart_as_array = Array.prototype.slice.call(cart_node, 2); // start at item 3 (2) 
for(var i=0;i<cart_as_array.length;i+=2) { 
    items.push(cart_as_array[i]); 
} 

現在,在控制檯,如果我型項目,我得到:

enter image description here

因此,我希望環路去在這種情況下大約一次。

這裏是我的循環:

for(i=0; i < items.length; i++) { 
    // set vars 
    cart[i] = {}; 
    var name = items[i].querySelector('.txtStayRoomDescription').textContent; 
    var price = items[i].querySelector('.tblItinPriceSummary tr td:last-child').textContent; 
    var brand = items[i].querySelector('.txtStayRoomLocation').textContent; 

    // add to object 
    cart[i].name = name; 
    cart[i].price = price; 
    cart[i].brand = brand; 

    // add to cart array 
    cart.push(cart[i]); 
    } 

其中給出:

enter image description here

我期待與陣列包含車一個項目的對象不是兩個結果。但它有兩個相同的對象。

這是怎麼回事?

回答

2

在你的代碼的第3行您在陣列中創建一個空對象:

cart[i] = {}; 

然後在第14行你把該對象到您的陣列再次

cart.push(cart[i]); 

你應該相反,只是創建一個對象,並推到底:

var item = {}; 
// ... add properties to item ... 
cart.push(item) 
+0

啊我現在看到了。感謝您的拼寫。 – 2015-04-01 20:37:52

3

您首先將cart數組的第i個元素設置爲對象,然後將其推到末尾;如你所見,這將放入兩份。

編輯的問題在註釋:

讓我們通過代碼逐行:

for(i=0; i < items.length; i++) { 
    // set vars 
    cart[i] = {}; 

cart[i] = {}後在指數i把一個空的對象cart陣列中;如果之前有什麼東西,它將被覆蓋,否則數組將被簡單地添加。

// stuff setting properties removed 

// add to object 
cart[i].name = name; 
cart[i].price = price; 
cart[i].brand = brand; 

現在,cart[i]處的對象已收到您構建的屬性。 cart數組現在包含位置爲i的這些名稱,價格和品牌屬性的對象。現在

// add to cart array 
cart.push(cart[i]); 

,除了在i基準,你已經被推第二參考以上到該陣列的端部儲存在i的對象。這將產生你正在觀察的行爲:對象將在數組中兩次。

我建議更改cart[i] = {}(以及添加此對象的屬性的相關代碼)來構造該對象,同時將其存儲在局部變量中,然後在循環結束時將其推送到數組。

+0

其實,他們不是t副本。他們都提到同一個對象。 – Barmar 2015-04-01 20:29:00

+0

對不起,對於看過這篇文章的人來說,這一點非常明顯。我沒有關注,但 – 2015-04-01 20:29:44

+0

@Barmar:是的,副本在這裏馬虎不得;我應該說兩個引用 – 2015-04-01 20:31:06