Ekjon Ответов: 1

Массив объектов Jquery перезаписывается при загрузке


Мой массив объектов, которым присваиваются значения в document ready- & gt; div load, перезаписывается последним значением. Каждый объект в массиве один и тот же (последний).

Что я уже пробовал:

I have this array of objects being loaded:

<pre>$(document).ready(function () {
  $("<div></div>").load("/Stats/Contents #stats", function () {
    statcount = $(".list-group-item", this).length;

    for (var j = 0; j < statcount; j++) {
      statList.push(stat);
    }

    for (var i = 0; i < statcount; i++) {
      statList[i].statId = document.getElementById("statId-" + (i + 1) + "").value;
      statList[i].productDescription = document.getElementById("productType-" + (i + 1) + "").value;
      statList[i].lastMeasuredInventoryAmount = document.getElementById("statLastMeasureAmount-" + (i + 1) + "").value;
    }
  )}
)}

.и так далее. Затем я получаю измененные значения и сохраняю их, однако в вызове ajax post все объекты массива одинаковы (последний назначенный), похоже, они перезаписываются. Есть идеи? Я видел этот код типа отложенного / обещания, но не уверен, что есть более простой способ. Спасибо.

Kornfeld Eliyahu Peter

Вы отладили его?

1 Ответов

Рейтинг:
2

Richard Deeming

Цитата:
statList.push(stat);

Вы не показали нам, где вы его создаете, но похоже, что вы толкаете один и тот же объект в массив в цикле. Любое обновление свойства этого отдельного объекта будет отражено независимо от того, из какого индекса массива вы обращаетесь к нему.

Вам нужно создать новый объект для каждого слота в массиве.
for (var j = 0; j < statcount; j++) {
    var stat = {};
    statList.push(stat);
}


Ekjon

Привет, Питер, Извини, что я вставил старую версию кода. Я действительно менял его, чтобы каждый раз иметь новый объект, как вы предлагали.

for (var i = 0; i < statcount; i++) {      
         var statCopy = stat;      
         statCopy.statId = document.getElementById("statId-" + (i + 1) + "").value;      
         ......      
         statList.push(statCopy);
}


Но это не имело никакого значения. Отладка показывает, что цикл правильно присваивает значения массиву объектов. Однако, когда я пытаюсь сделать запись в другом методе click, теперь массив содержит все те же значения для каждого слота.

Richard Deeming

Вы по-прежнему помещаете один и тот же объект в каждый слот массива. Создание новой переменной, указывающей на объект, не создает копию объекта.

Воспользуйся: var statCopy = {}; чтобы сделать новый объект.