【问题标题】:Looping through array using splice method infinite loop javascript使用拼接方法无限循环javascript遍历数组
【发布时间】:2018-06-29 22:52:04
【问题描述】:

当我使用 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);
    }
};

【问题讨论】:

  • 您在每次迭代中使数组 1 元素更长,因此您的循环的结束条件永远不会接近被满足。你想达到什么目标?
  • 我的理论是 splice 不断向数组中添加元素,这样循环就永远不会结束

标签: javascript arrays loops infinite-loop


【解决方案1】:

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

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

【讨论】:

  • 这似乎比我的回答更好
【解决方案2】:

你想在每个数组元素之后插入一个随机值,这样字符串“example”就会变成“e5x9a2m4p7l1e3”之类的东西

有两个问题:

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

  • 1234563远离。你需要再增加一次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");

【讨论】:

  • @Tom,我添加了相应的 sn-p 作为证明它不会永远循环。
【解决方案3】:

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

编辑:我的错字是问题所在。我什至不必使用 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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2013-03-19
    相关资源
    最近更新 更多