当循环遍历JS数组的值,并且我删除了值时,我是否需要使用while而不是for?

sna*_*che 7 javascript arrays for-loop

var myArray = [1,2,3,4,5,6,7,8,9];

function isOdd(value){
    return value % 2;
}

for(var i = 0; i < myArray.length; i++){
    if(isOdd(myArray[i])){
        myArray.splice(i,1);
        i--;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码采用任意长度的数组并检查每个值.如果数组的位满足任意条件(在这种情况下,如果它是奇数),则从数组中删除它.

Array.prototype.splice()用于从数组中删除值,然后i递减以考虑数组中"向下移动"的其余值以填充已移除的值留下的间隙(因此循环不会跳过某个值).

但是,fori等于数组的长度时,循环结束,当删除值时,循环会变短.

myArray.length随着循环的进行,值是否会动态减少,还是在循环开始时保存值而不是在删除值时更新?如果是后者,我该怎么做才能修复我的循环?

谢谢!

Nin*_*olz 3

myArray.length随着对数组的操作而变化。但是,如果没有适当的填充,循环和拼接会导致不需要的结果。

为了防止不必要的更正,请从末尾使用 while 循环,以保留数组的其余部分进行处理。

function isOdd(value) {
    return value % 2;
}

var myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9],
    i = myArray.length;

while (i--) {
    if (isOdd(myArray[i])) {
        myArray.splice(i, 1);
    }
}
console.log(myArray);
Run Code Online (Sandbox Code Playgroud)