Почему мой объект не меняется, когда я переназначаю свойства в цикле forEach? - PullRequest
0 голосов
/ 24 октября 2019

Я получаю массив объектов из вызова RX / JS из бэкэнда http. Он возвращает объект, с которым я затем пытаюсь работать. Я делаю изменения в этом объекте, используя цикл for (в этом примере я пробую .forEach, потому что я пробовал несколько разных вещей, и ни одна из них, похоже, не работает.

Когда я запускаю кодЯ получаю очень странную проблему. Если я возвращаю значения свойств, я получаю новые значения (т. Е. correctionQueued возвращает значение true и т. Д.), Но уже на следующей строке, когда я возвращаю объект, те же значенияте же, что и исходные (correctionQueued === false и т. д.) ОДНАКО, correctionStatus (которого нет в исходном объекте из http) устанавливает просто отлично.

Я не понимаюкак array[index].correctionQueued может возвращать true, но array[index] возвращает объект с correctionQueued как false.

После цикла исходный массив (checklistCopy) идентичен объекту до forEachцикл, за исключением того, что теперь установлено новое свойство (correctionStatus), но все свойства, которые я изменил и которые были частью исходного объекта, остаются такими же, как были.

Я пытался использовать for для, для in,и .forEach. Я использовал индекс, чтобы изменить Oоригинальный массив, всегда один и тот же результат. Предыдущие свойства не меняются, добавляются новые свойства. Я даже пытался работать с копией объекта на случай, если в объекте, возвращенном из rxjs, есть что-то особенное, но безрезультатно.

    checklistCopy.forEach((checklistItem, index, array) => {
      if (checklistItem.crCode.isirName === correctionSetItem) {
        array[index].correctionQueued = true;
        array[index].correctionValue = mostRecentCorrection.correctionValue;
        array[index].correctionStatus = mostRecentCorrection.status;
        console.log(array[index].correctionQueued, array[index].correctionValue, array[index].correctionStatus);
        console.log(array[index]);
      }
    }
    );

Я не получаю сообщение об ошибке, но получаю. .

Исходный объект:

correctionQueued: false;
correctionValue: JAAMES;

-

console.log(array[index].correctionQueued, array[index].correctionValue, array[index].correctionStatus);
true JAMES            SENT

, но при печати всего объекта:

console.log(array[index]);

correctionQueued: false;
correctionValue: JAAMES;
correctionStatus: "SENT'; <-- This is set correctly but does not exist on original object.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

console.log(array[index]) (по крайней мере, в Chrome) просто добавляет ссылку на объект в консоль. Значения не разрешаются до тех пор, пока вы не развернете его, поэтому ваш оператор журнала консоли фактически не захватывает значения в тот момент времени.

Измените свой оператор консоли на: console.log(JSON.stringify(array[index])), и вы должны обнаружить, что значенияисправить во время выполнения оператора журнала.

Видимое поведение предполагает, что что-то приходит позже и изменяет свойства объекта обратно на первоначальное значение. Если вы не покажете более полный пример, мы не сможем помочь вам найти виновного. Но, надеюсь, это ответит на вопрос, почему ваши журналы показывают то, что они показывают.

0 голосов
/ 24 октября 2019

Ваш вывод также не имеет смысла для меня, но очистка вашего кода может помочь вам. Попробуйте это:

checklistCopy.forEach(checklistItem => {
  checklistItem.correctionQueued = checklistItem.crCode.isirName === correctionSetItem;
  if (checklistItem.correctionQueued) {
      checklistItem.correctionValue = mostRecentCorrection.correctionValue;
      checklistItem.correctionStatus = mostRecentCorrection.status;
      console.log('checklistItem', checklistItem)
    }
  }
);
...