无限循环原因不明

时间:2015-10-29 21:02:28

标签: javascript arrays string sorting

我很困惑为什么:

  

regResponse.splice(i + 1,0,newString);

导致无限循环或类似的东西(页面不加载)。如果我把它放在if块之外,它不是一个无限循环,但那时我想要做的逻辑将不起作用。这是怎么回事?我不明白为什么它会冻结页面。

如果你把

  

中断;

直接在regResponse.splice行之后,你会在控制台日志中看到我正在做的事情的逻辑开始变得一致,因为标题和链接本身现在分开前三个项目(直到达到if循环条件并突破它)。

var myString =“加速世界| http://www.anime-planet.com/anime/accel-worldAh!我的女神| http://www.anime-planet.com/anime/ah-my-goddessAh!我的女神电视| http://www.anime-planet.com/anime/ah-my-goddess-tvAi Yori Aoshi | http://www.anime-planet.com/anime/ai-yori-aoshiAir齿轮| http://www.anime-planet.com/anime/air-gear

myString = myString.replace(/([a-z])([A-Z])/g, '$1 $2');

var reg = /[^|]+/g;
var regResponse = myString.match(reg);
console.log(regResponse);


for(i = 0; i < regResponse.length; i++) {
    if (regResponse[i].length > 20) {
       space = regResponse[i].indexOf(' ');
        var newString = regResponse[i].substring(space+1, regResponse[i].length);
        regResponse[i] = regResponse[i].slice(0, space);
        regResponse.splice(i+1, 0, newString);



    }

}

2 个答案:

答案 0 :(得分:2)

无限循环是扩展数组(splice)的结果,因为你正在循环它。尝试向后执行循环以避免这种情况:

for (i = regResponse.length-1; i>=0; i--) {

http://jsfiddle.net/mblase75/cgop02f1/

答案 1 :(得分:1)

您的终止条件取决于regResponse.length,但您还要向regResponse添加元素。

Here is the documentation on Array.splice

让我们深入研究您的代码:

for(i = 0; i < regResponse.length; i++) {
    if (regResponse[i].length > 20) {
       space = regResponse[i].indexOf(' ');
        var newString = regResponse[i].substring(space+1, regResponse[i].length);
        regResponse[i] = regResponse[i].slice(0, space);
        regResponse.splice(i+1, 0, newString);
    }
}

让我们看看为什么这不会终止。我们将假设循环应该在i之后的位置,即i === regResponse.length - 1。现在,行regResponse.splice(i+1, 0, newString)会将新元素追加到regResponse数组的 end 。现在i === regResponse.length - 2

看起来你曾想让if (regResponse[i].length > 20)成为你的终止声明。请改为if (regResponse[i].length < 20)