使用拼接方法无限循环javascript通过数组循环

时间:2018-01-21 00:12:10

标签: javascript arrays loops infinite-loop

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你想在每个数组元素之后插入一个随机值,以便字符串&#34;例如&#34;会变得像&#34; e5x9a2m4p7l1e3&#34;

有两个问题:

  • 您的for循环没有结束条件会变为false。您需要说明i < arr.length而不仅仅是arr.length,这对于非空数组来说总是很简单。

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

所以你的循环应该是:

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

&#13;
&#13;
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");
&#13;
&#13;
&#13;

或者保存添加内容:

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

&#13;
&#13;
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");
&#13;
&#13;
&#13;