Я хочу изменить текущий объект для каждого цикла, и он не работает, почему он не работает и как я могу это сделать?
var arr = [{num: 1}, {num: 2}];
arr.forEach(function(item) {
item = {somethingElse: 1}
});
console.log(arr);
Я хочу изменить текущий объект для каждого цикла, и он не работает, почему он не работает и как я могу это сделать?
var arr = [{num: 1}, {num: 2}];
arr.forEach(function(item) {
item = {somethingElse: 1}
});
console.log(arr);
Он не работает, потому что все, что вы делаете, - это обновление значения аргумента, который вам дал (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
, не заменять объект целиком, ответ Кирилла показывает вам, как это сделать.
Еще одно разнообразие в списке ответов
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
});
Вы изменяете локальную ссылку item
в функции обратного вызова.
Чтобы изменить содержимое массива, вам нужно использовать индекс массива и назначить ему новую ссылку, как показано ниже
arr.forEach(function(item, i) {
arr[i] = {somethingElse: 1} //using index, change the reference in array
});
Вы не работаете над объектом, поэтому изменения не переносятся.
Вместо этого вы можете сделать это:
arr.forEach(function(item, ind, array) {
array[ind] = {somethingElse: 1}
});
В соответствующей заметке, если вы ищете, как изменить свойство объектов в массиве, имейте в виду, что вы можете просто работать с каждым в вашем цикле forEach
, и изменения будут фиксироваться:
let myArray = [{}];
myArray.forEach((obj) => {obj.foo = "bar";});
console.log(myArray[0].foo); //"bar"