推送到 for-in 循环数组以扩展该 for-in 循环的迭代次数

Pushing to array of for-in loop to extend the number of iterations of that for-in loop

在 Javascript 中考虑这一点:

var words = ['hello,','how','are'];
for(var word in words) {
    console.log(words[word]);
    if (words[word] == 'are') {
        words.push('you');
    }
}

它输出:

hello,
how
are

我的期望是它将此输出到控制台:

hello,
how
are
you

因此,迭代次数似乎是由循环开始时的单词长度设置的,并且随着单词长度在循环持续时间内发生变化,它无法更新该数字。谁能想出另一种方法来做到这一点?

使用 while 循环和increment/decrement你自己的计数。

请注意,更改您在循环内迭代的 array/object 的内容被认为是不好的做法,正是因为它会导致意外行为。

您可以创建一个新数组:

var words = ['hello,','how','are'];
var newwords = [];
for(var word in words) {
    console.log(words[word]);
    newwords.push(words[word]);
    if (words[word] == 'are') {
        newwords.push('you');
    }
}
console.log(newwords); //["hello,", "how", "are", "you"]

但我不确定为什么您的代码不起作用。

http://jsfiddle.net/n0m27reo/

不过,我偏向于使用 for (var i = 0; i < array.length; i++),我认为这也更有效率。它还允许您在不需要第二个数组的情况下尝试完成:

http://jsfiddle.net/n0m27reo/1/

var words = ['hello,','how','are'];
for(var i=0; i < words.length; i++) {
    console.log(words[i]);
    if (words[i] == 'are') {
        words.push('you');
    }
}
console.log(words); //["hello,", "how", "are", "you"]

您可以使用 for 循环在每次迭代中检查 length 而不是 for in :

var words = ['hello,','how','are'];
for(var i=0; i < words.length; i++) {
    console.log(words[i]);
    if (words[i] == 'are') {
        words.push('you');
    }
}

输出:

hello,
how
are
you

希望对您有所帮助。

您不应使用 for..in 遍历数组。如果可用,请使用新的 for..of 或跟踪要迭代的索引。两者都将迭代 online(即遍历添加的项目)。 .forEach不在线迭代

var words = ['hello,','how','are'];
for (var i = 0; i < words.length; i++) {
    console.log(words[i]);
    if (words[i] == 'are') {
        words.push('you');
    }
}

// ES6
let words = ['hello,','how','are'];
for (let word of words) {
    console.log(word);
    if (word == 'are') {
        words.push('you');
    }
}

老式的方法会做你想做的事:

var words = ['hello,','how','are'];
var newwords = [];
for(var word=0; word < words.length; word++) {
    console.log(words[word]);
    if (words[word] == 'are') {
        words.push('you');
    }
}