我有
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
来访问内部数组,然后我做了另一个循环来访问该内部数组的每个元素?
试图完全理解.forEach()
JS。谢谢!
有两个原因:
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 发布了你如何使用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
解决方案通常是我所能达到的,除非我有充分的理由进行适当的更新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句