我有
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()
。谢谢!
答案 0 :(得分:3)
有两个原因:
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
,则可能应该一致地进行。 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)