Javascript 如何更改for of循环中的元素
如何使用For of循环更改数组中的对象? 以下代码:Javascript 如何更改for of循环中的元素,javascript,for-loop,ecmascript-6,Javascript,For Loop,Ecmascript 6,如何使用For of循环更改数组中的对象? 以下代码: let arr = ['a', 'b', 'c', 'd', 'e']; for (let v of arr) { if (v === 'c') { v = 'f'; break; } } console.log(arr); 我想找到第一个字母c并将其更改为f,但arr没有更改,可能是因为它没有被引用?但是arr的v不应该使对象v与arr中的对象v相同吗?如规范中所述,让从数组元
let arr = ['a', 'b', 'c', 'd', 'e'];
for (let v of arr) {
if (v === 'c') {
v = 'f';
break;
}
}
console.log(arr);
我想找到第一个字母c并将其更改为f,但arr没有更改,可能是因为它没有被引用?但是arr的v不应该使对象v与arr中的对象v相同吗?如规范中所述,让
从数组元素的副本声明一个新变量。因此,更改v
不会更改数组中的值。这是由var
和const
共享的,只是javascripts行为。创建新对象时,它将开始为空
您的循环基本上是说“对于
arr
中的每个元素,声明一个包含其副本的变量,然后如果该变量是c
,则将该副本更改为f
”String
等简单值的引用。要获得数组引用,您需要让数组成为对象数组,如[{char:'a'},{char:'b'},…]
。然后在迭代器中,您可以通过更改char
属性来更改数组的元素
let arr = [{char: 'a'}, {char :'b'}, ...];
for (let v of arr) {
if (v.char === 'c') {
v.char = 'f';
break;
}
}
v
不是对数组元素的引用,它只是一个变量,分配给数组迭代器产生的值。如果指定给它,则只有变量v
会更改,但数组不会更改
为此,您需要显式引用属性及其索引并为其赋值:
let arr = ['a', 'b', 'c', 'd', 'e'];
for (let [i, v] of arr.entries()) {
if (v === 'c') {
arr[i] = 'f';
break;
}
}
console.log(arr); // ['a', 'b', 'f', 'd', 'e']
迭代器不提供改变底层结构的方法,您需要自己做。在更改
v
之前,数组和v
指向相同的值,或者在本例中具有相同的值:
arr[2] -> 'c' <- v
v
和arr[2]
只是占位符,但不同。正确答案:
let arr = ['a', 'b', 'c', 'd', 'e'];
let i = 0;
for (let v of arr) {
if (v == 'c') {
arr[i] = 'f';
break;
}
i++;
}
console.log(arr);
:-p否,JavaScript不允许属性别名。变量
v
是数组中值的副本。若要执行所需操作,可以使用.map()
,或使用.findinex()
查找目标元素的索引,然后修改数组。对于数组上的in-loop是一个坏主意。使用内置的数组方法在数组上循环@埃帕斯卡雷罗咖啡时间:)@Pointy啊,读这篇文章就像不在的。当你有forEach/filter/map/etcOk时,lol仍然认为of是一个糟糕的选择,明白吗。如果数组不包含字符串,而是包含属性的自定义对象,该怎么办?然后我可以像v=newObject那样改变整个对象吗?或者我必须要v.myProp=newObject.myProp吗?@williamwmy我不确定,但我认为只有v.myProp=newObject.myProp
possible@williamwmy从技术上讲,v
只包含对数组元素的引用,因此v=newObj
将放置到v
一个新引用,对数组元素的旧引用将被销毁谢谢,我试过了,你是对的,我不能只设置整个对象,因为对象有很多属性,我也必须循环遍历它们,这使得代码有点混乱。@williamwmy,你可以放置到array[{obj:yourObjectWithTonsOfProperties}]
然后v.obj=newObj
该行为与let
无关。你会在var
中看到同样的情况。我从来没有说过Let是问题所在,但它的行为会导致所发生的事情,但是var
或const
也可以这样说。这种行为决不是特定于let
,它只是JS中值的一般工作方式。这是事实,也是一个公平的观点,尽管我从未说过它是特定的,但我会接受你的建议,并指出它并不是let
专门导致问题的原因,它会记录:[“a”、“b”、“c”、“d”、“e”
。为什么?@rv7我把.entries()
中的索引和值弄混了。谢谢你的提醒!
let arr = ['a', 'b', 'c', 'd', 'e'];
let i = 0;
for (let v of arr) {
if (v == 'c') {
arr[i] = 'f';
break;
}
i++;
}
console.log(arr);