更改for-of循环中项目的值

时间:2016-12-29 16:25:36

标签: javascript ecmascript-6

我正在学习ES6中的一些新技巧,我非常喜欢数组的for-of循环。我遇到麻烦的一件事是,如果我想操纵循环中当前项目的值。

例如在ES5中:

var myArr = [1,2,3];
for(var i = 0; i < myArr; i++){
    myArr[i] = "moo"
}

当在ES6中使用for-of循环时,如果我更改循环内当前项的值,它不会反映在数组中。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:6)

如果您还需要带有for … of循环的数组迭代中的索引,请使用.entries() method

const myArr = [1,2,3];
for (const [i, el] of myArr.entries()) {
    myArr[i] = "moo" + el;
}

如果您只对索引感兴趣而没有值,则可以改为myArr.keys()

答案 1 :(得分:1)

不是for-of,不是。您没有该项的索引,并且写入您的变量对原始数组没有影响。

你可以破解它:

let index = 0;
for (const v of myArr) {
    if (/*...some condition...*/) {
        myArr[index] = "moo";
    }
    ++index;
}

...这是有效的,因为数组迭代器的定义,但它非常详细。在这种情况下,forEach可能是更好的选择,如果你想要就地更新数组,或map如果你很乐意创建一个新数组,或者一个好的老式for let myArr = [1,2,3]; myArr[10] = "sparse"; // Just to prove it works console.log("before", myArr); let index = 0; for (const v of myArr) { if (v === "sparse") { myArr[index] = "moo"; } ++index; } console.log("after", myArr); 1}}循环。

以上的无理示例(也表明它适用于稀疏数组,因为定义了数组迭代器的方式):

 1. SELECT * FROM TABLE WHERE NAME = '3" Nail';
 2. SELECT * FROM TABLE WHERE NAME = '3\" Nail';
 3. SELECT * FROM TABLE WHERE NAME = '3'" Nail';
 4. SELECT * FROM TABLE WHERE NAME = '3'''' Nail';
 5. SELECT * FROM TABLE WHERE NAME = '3\'\' Nail';