Js меняет объект внутри массива в каждом цикле

Я хочу изменить текущий объект для каждого цикла, и он не работает, почему он не работает и как я могу это сделать?

var arr = [{num: 1}, {num: 2}];

arr.forEach(function(item) {
  item = {somethingElse: 1}
});

console.log(arr);

Ответ 1

Он не работает, потому что все, что вы делаете, - это обновление значения аргумента, который вам дал (item), который не имеет прямого подключения к массиву. Это изменение исчезает, как только возвращается ваш обратный вызов.

Самый подходящий способ сделать это - использовать map:

var arr = [{num: 1}, {num: 2}];

arr = arr.map(function(item) {
  return {somethingElse: 1};
});

console.log(arr);

map предоставляет вашу функцию каждому элементу и создает новый массив из того, что вы возвращаете.

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

var arr = [{num: 1}, {num: 2}];

arr.forEach(function(item, index) {
  arr[index] = {somethingElse: 1};
});

console.log(arr);

Конечно, в обоих случаях выше вы фактически используете item для чего-то, чего нет в вашем примере кода... Если вы хотите добавить/удалить свойства на item, не заменять объект целиком, ответ Кирилла показывает вам, как это сделать.

Ответ 2

Еще одно разнообразие в списке ответов

var arr = [{num: 1}, {num: 2}];

arr.forEach(function(item) {
  item.something = 2;//setting the value
  delete item.num;//deleting the num from the object
});

Ответ 3

Вы изменяете локальную ссылку item в функции обратного вызова.

Чтобы изменить содержимое массива, вам нужно использовать индекс массива и назначить ему новую ссылку, как показано ниже

arr.forEach(function(item, i) {
  arr[i] = {somethingElse: 1} //using index, change the reference in array
});

Ответ 4

Вы не работаете над объектом, поэтому изменения не переносятся.

Вместо этого вы можете сделать это:

arr.forEach(function(item, ind, array) {
  array[ind] = {somethingElse: 1}
});

Ответ 5

В соответствующей заметке, если вы ищете, как изменить свойство объектов в массиве, имейте в виду, что вы можете просто работать с каждым в вашем цикле forEach, и изменения будут фиксироваться:

let myArray = [{}];
myArray.forEach((obj) => {obj.foo = "bar";});
console.log(myArray[0].foo); //"bar"