Как правильно передать объект в массив Javascript? Добрый день! Имеется следующий код:var item = {}; // Объявляем объект var items = new Array(); // Объвляем массив function data_send(n){ var f = $j('#pricelist_'+n); // Находим форму с нужным ID var i = 0; f.find('.input').each(function(){ // Находим в форме все элементы с классом input var val = $j(this).val(); // Получаем значение найденного элемента if(val != 0){ // если значение не равно 0, то: item.name = $j(this).parent('td').parent('tr').children('td:first-child').text(); item.amount = $j(this).val(); item.work = $j(this).parent('td').parent('tr').find('.work').text(); item.materials = $j(this).parent('td').parent('tr').find('.materials').text(); item.summary = $j(this).parent('td').parent('tr').find('.summary').text(); items[i] = item; // записываем объект в массив i = i+1; } }); for(j=0;j alert(JSON.stringify(items[j])); } } Проблема в том, что когда записываем объекты в массив, то все отлично. В ячейку items[0] записываем Объект 1, в ячейку items[1] попадает Объект 2, в ячейку items[2] попадает Объект 3 и т.д. Но стоит запустить функцию вывода элементов массива, то во всех его ячейках показывает всегда последний объект: в ячейке items[0] = Объект 3, items[1] = Объект 3, items[2] = Объект 3. Ничего не понимаю, как такое выходит... помогите разобраться.
Проблема возникает из-за того, что в JavaScript объекты передаются по ссылке, а не по значению. Поэтому при каждой итерации цикла в объекте item изменяются свойства, и в итоге в массиве items оказывается несколько ссылок на один и тот же объект.
Чтобы исправить это, нужно создавать новый объект item на каждой итерации цикла. Можно сделать это следующим образом:
function data_send(n){ var f = $j('#pricelist_'+n); var i = 0; f.find('.input').each(function(){ var val = $j(this).val(); if(val != 0){ var item = {}; // Создаем новый объект на каждой итерации item.name = $j(this).parent('td').parent('tr').children('td:first-child').text(); item.amount = $j(this).val(); item.work = $j(this).parent('td').parent('tr').find('.work').text(); item.materials = $j(this).parent('td').parent('tr').find('.materials').text(); item.summary = $j(this).parent('td').parent('tr').find('.summary').text(); items[i] = item; i = i+1; } }); for(j=0; j<i; j++) { alert(JSON.stringify(items[j])); } }
Теперь на каждой итерации создается новый объект item, который добавляется в массив items. В результате все объекты сохраняются как отдельные элементы массива и не затирают друг друга.
Проблема возникает из-за того, что в JavaScript объекты передаются по ссылке, а не по значению. Поэтому при каждой итерации цикла в объекте item изменяются свойства, и в итоге в массиве items оказывается несколько ссылок на один и тот же объект.
Чтобы исправить это, нужно создавать новый объект item на каждой итерации цикла. Можно сделать это следующим образом:
function data_send(n){var f = $j('#pricelist_'+n);
var i = 0;
f.find('.input').each(function(){
var val = $j(this).val();
if(val != 0){
var item = {}; // Создаем новый объект на каждой итерации
item.name = $j(this).parent('td').parent('tr').children('td:first-child').text();
item.amount = $j(this).val();
item.work = $j(this).parent('td').parent('tr').find('.work').text();
item.materials = $j(this).parent('td').parent('tr').find('.materials').text();
item.summary = $j(this).parent('td').parent('tr').find('.summary').text();
items[i] = item;
i = i+1;
}
});
for(j=0; j<i; j++) {
alert(JSON.stringify(items[j]));
}
}
Теперь на каждой итерации создается новый объект item, который добавляется в массив items. В результате все объекты сохраняются как отдельные элементы массива и не затирают друг друга.