我很困惑为什么:
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);
}
}
答案 0 :(得分:2)
无限循环是扩展数组(splice
)的结果,因为你正在循环它。尝试向后执行循环以避免这种情况:
for (i = regResponse.length-1; i>=0; i--) {
答案 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)
。