Существует две причины:
forEach
полностью игнорирует значение, которое вы возвращаете из его обратного вызова
Вы никогда ничего не делаете для обновленияvalue
Если вы хотите изменить value
, вы можете сделать следующее:
value = value.map(element => element + 2);
..., что создает newМассив и присваивает его value
;обратите внимание, что b
совершенно не затронут.(Это как ваш value += 2
в другой ветке, что также никак не влияет на b
.) Пример в реальном времени:
const b = [1, 2, 3, [4, 5], 6];
b.forEach((value, index) => {
if (Array.isArray(value)) {
value = value.map(element => element + 2);
}
else {
value += 2;
}
console.log(`The value at ${index} is ${value}`);
})
// Just to show that `b` is unaffected:
console.log(`b[3] = ${b[3]}`);
Или вот это:
value.forEach((element, index) => {
value[index] = element + 2;
});
... который изменяет исходный массив (внутри b
), а не соответствует ветви else
(которая не обновляется b
).Живой пример:
const b = [1, 2, 3, [4, 5], 6];
b.forEach((value, index) => {
if (Array.isArray(value)) {
value.forEach((element, index) => {
value[index] = element + 2;
});
}
else {
value += 2;
}
console.log(`The value at ${index} is ${value}`);
})
// Just to show that `b` is modified:
console.log(`b[3] = ${b[3]}`);
Но , если вы хотите изменить b
, вам, вероятно, следует делать это последовательно. Кобе опубликовал как вы это сделаете с map
, который создает новый массив и часто является тем, что вы хотите.Если вы хотите обновить существующий массив, то:
const b = [1, 2, 3, [4, 5], 6];
for (const [bIndex, value] of b.entries()) {
if (Array.isArray(value)) {
for (const [vIndex, entry] of value.entries()) {
value[vIndex] = entry + 2;
}
} else {
b[bIndex] = value + 2;
}
}
console.log(`b = ${JSON.stringify(b)}`);
... но Решение Кобе map
обычно является тем, к чему я бы стремился, если у меня не было веской причины для обновления на месте.