Как правильно передать объект в массив Javascript?

Тема в разделе "JavaScript", создана пользователем KoNnY, 26 июл 2015.

Модераторы: ZiX
  1. KoNnY

    KoNnY Постоялец

    Регистр.:
    14 дек 2014
    Сообщения:
    67
    Симпатии:
    5
    Добрый день!

    Имеется следующий код:

    Код:
    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.

    Ничего не понимаю, как такое выходит... помогите разобраться.
     
  2. wwwxakep

    wwwxakep Создатель

    Регистр.:
    4 фев 2007
    Сообщения:
    30
    Симпатии:
    8
    Обнуляй item в начале цикла: item = {};
    P.S. "i = i+1" = "i++"
     
  3. Aglok

    Aglok ∞³

    Регистр.:
    9 янв 2012
    Сообщения:
    162
    Симпатии:
    46
    У тебя при каждой записи в массив items, записывается ссылка на глобальный объект user. К концу цикла user будет иметь последнее значение из input. Чтобы сохранить значения всех объектов в которые крутятся в цикле, тебе нужно сохранить ссылку на новый объект. Поэтому код:
    Код:
    var item = {}; 
    Нужно поставить внутрь самой функции each:
    Код:
    f.find('.input').each(function(){
      var item = {};
      ...
    });
     
    Последнее редактирование: 27 июл 2015
    KoNnY нравится это.