Задать вопрос
@KoNnY
web-master

Как правильно передать объект в массив 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<i; j++) {   // перебираем полученный массив и выводим элементы
        alert(JSON.stringify(items[j])); 
    }

}


Проблема в том, что когда записываем объекты в массив, то все отлично. В ячейку items[0] записываем Объект 1, в ячейку items[1] попадает Объект 2, в ячейку items[2] попадает Объект 3 и т.д.

Но стоит запустить функцию вывода элементов массива, то во всех его ячейках показывает всегда последний объект: в ячейке items[0] = Объект 3, items[1] = Объект 3, items[2] = Объект 3.

Ничего не понимаю, как такое выходит... помогите разобраться.
  • Вопрос задан
  • 1206 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@iissakin
После n таких добавлений в массиве оказываются n ссылок на объект item. В момент вывода item уже принял состояние "последнего объекта", как вы его назвали, поэтому и получается вывод одного и того же n раз.
Вариант решения - объявлять и инициализировать item не глобально, а внутри коллбека, в котором идёт инициализация полей объекта и его добавление в массив.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы