我有
b = [1, 2, 3, [4, 5], 6];
b.forEach((value, index) => {
if (Array.isArray(value)) {
value.forEach(element => element += 2)
}
else {
value += 2;
}
console.log(`The value at ${index} is ${value}`);
})
我想知道为什么这是记录
3的值为4,5
代替
3的值是6、7
我以为我可以通过检查值是否为数组来访问内部数组,然后又执行了另一个
.forEach
循环来访问该内部数组的每个元素?试图完全理解JS中的
.forEach()
。谢谢! 最佳答案
有两个原因:forEach
完全忽略您从其回调返回的值
您从不做任何更新value
如果要修改value
,则可以执行以下操作:
value = value.map(element => element + 2);
...这将创建一个新数组并将其分配给
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
,则可能应该一致地进行操作。 Kobe posted如何使用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)}`);
...但是Kobe's
map
solution通常是我想要达到的目标,除非我有充分的理由进行适当的更新。