2015-04-01 3 views
0

У меня есть некоторый код:Для петли петли слишком много раз

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

А теперь я вижу. Спасибо, что написано. –

3

Вы сначала устанавливаете i-й элемент массива cart в качестве своего объекта, а затем также нажимаете его на конец; это, как вы видите, поместит две копии.

РЕДАКТИР вопрос в комментариях:

Поедем через код построчно:

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

После cart[i] = {} ставит пустой объект в cart массива по индексу i; если раньше было что-то, оно будет перезаписано, иначе массив будет просто добавлен.

// 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

Фактически, они не являются т копий.Оба они относятся к одному и тому же объекту. – Barmar

+0

Мне жаль, что это должно выглядеть действительно очевидным для людей, которые видели этот пост. Я не слежу, хотя –

+0

@Barmar: да, копии здесь неаккуратные; Я должен был сказать две ссылки: –

Смежные вопросы