使用 splice 方法无限循环遍历数组 javascript

Looping through array using splice method infinite loop javascript

当我使用 splice 方法遍历数组时,页面就死机了。看起来我造成了无限循环。 lib.randomInt() 有效,所以这不是问题。

function() {
return function(string) {
    var arr = string.split("")
    arr.sort();
    for(var i = 0; arr.length;i++){
        arr.splice((i+1),0,lib.randomInt(9));
    }
    var pseudocryptarr = arr.join("");
}
})()("example");

这来自 html

主文件上方的另一个文件
var lib = {
factorial: function(num){
  function _factorial(num){
    if(num === 1){
        return 1;
        } else {
            return num*_factorial(num-1);
        }
    }
    console.log(num+"! = " + _factorial(num));
    },
    randomInt: function(int,offset){
        if(offset == undefined || null || NaN){
            offset = 0;
        }
        return Math.floor(Math.random()*int)+offset;
    },
    display: function(m, fn){
        fn(m);
    }
};

修改数组本身时必须反向循环以避免像这样破坏循环...

for (var i=arr.length-1; i>=0; i--){}

我修好了。我想在每个字符之后都有一个数字。使用预循环数组长度并在迭代两次时将其加倍,意味着拼接在新数字元素之后添加数字,然后添加字符。

编辑:问题出在我的错字上。我什至不必使用 len,只需按 2 进行迭代即可。

for(var i = 0;i < arr.length;i+=2){
  arr.splice((i+1),0,lib.randomInt(9));
}

(function() {
    return function(string) {
        var arr = string.split("")
        arr.sort();
        var len = arr.length
        for(var i = 0;i < len*2;i+=2){
            arr.splice((i+1),0,lib.randomInt(9));
        }
        var pseudocryptarr = arr.join("");
        console.log(pseudocryptarr);
    }
})()("example");

编辑:user4723924 方法更好:

(function() {
    return function(string) {
        var arr = string.split("")
        arr.sort();
        for(var i = arr.length;i >= 0;i--){
            arr.splice((i+1),0,lib.randomInt(9));
        }
        var pseudocryptarr = arr.join("");
        console.log(pseudocryptarr);
    }
})()("example");

猜测你想在每个数组元素后插入一个随机值,这样字符串"example"就会变成像"e5x9a2m4p7l1e3"

有两个问题:

  • 您的 for 循环没有会变为假的结束条件。您需要声明 i < arr.length 而不是 arr.length 这对于非空数组总是真实的。

  • 你在每次迭代中添加数组元素,但在下一次迭代中也访问它们,从那里你将只访问新插入的值而永远不会到达下一个原始元素与 i 保持 1 个索引。您需要再次递增 i。为此,如果 i+1 作为 splice 参数,您可以使用 ++i 代替。

所以你的循环应该是:

    for(var i = 0; i < arr.length; i++) {
        arr.splice(++i,0,lib.randomInt(9));
    }

const lib = { randomInt: n => Math.floor(Math.random()*n) };
(function() {
    return function(string) {
        var arr = string.split("")
        arr.sort();
        for(var i = 0; i < arr.length; i++) {
            arr.splice(++i,0,lib.randomInt(9));
        }
        var pseudocryptarr = arr.join("");
        console.log(pseudocryptarr);
    }
})()("example");

或保存加法:

    for(var i = 1; i <= arr.length; i+=2) {
        arr.splice(i,0,lib.randomInt(9));
    }

const lib = { randomInt: n => Math.floor(Math.random()*n) };
(function() {
    return function(string) {
        var arr = string.split("")
        arr.sort();
        for(var i = 1; i <= arr.length; i+=2) {
            arr.splice(i,0,lib.randomInt(9));
        }
        var pseudocryptarr = arr.join("");
        console.log(pseudocryptarr);
    }
})()("example");