我有



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通常是我想要达到的目标,除非我有充分的理由进行适当的更新。

10-02 01:14
查看更多