使用ForEach()-JavaScript

时间:2019-05-29 14:19:25

标签: javascript arrays foreach

我有

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()。谢谢!

2 个答案:

答案 0 :(得分:3)

有两个原因:

  1. forEach完全忽略您从其回调返回的值

  2. 您从不做任何更新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,则可能应该一致地进行。 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通常是我想要达到的目标。

答案 1 :(得分:1)

您正在编辑属性,而不是值,但是您没有在任何地方存储新属性。您应该引用您正在记录的值,而不是属性:

b = [1, 2, 3, [4, 5], 6];

b.forEach((value, index) => {
    if (Array.isArray(value)) {
        value.forEach((element, i) => value[i] += 2)
    } else {
        value += 2;
    }
    console.log(`The value at ${index} is ${value}`);
})

要避免编写此代码,应使用map返回具有修改后值的新数组:

b = [1, 2, 3, [4, 5], 6];

b = b.map(value => Array.isArray(value) ? value.map(el => el + 2) : value + 2)

console.log(b)