Как правильно передать объект в массив 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.
Ничего не понимаю, как такое выходит... помогите разобраться.

21 Авг 2019 в 07:07
204 +1
0
Ответы
1

Проблема возникает из-за того, что в 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. В результате все объекты сохраняются как отдельные элементы массива и не затирают друг друга.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 887 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир