浏览器冻结循环运行(JavaScript)

时间:2017-01-05 21:36:04

标签: javascript loops for-loop random

我正在尝试随机重建一段单词,而不是在JavaScript中重复相同的单词:

var  para = 'dashing through the snow' +
        ' in a one horse open sleigh' +
        ' over the fields we go' +
        ' laughing all the way';
console.log(para);
function getRandomNumber(min, max) 
{
     return Math.floor(Math.random() * (max - min)) + min;
}

var words = para.split(' ');
var newPara = '';

for(var i = 0; i < words.length - 1; i++)
{
  var curWord = words[getRandomNumber(0,words.length - 1)];

  if(newPara.indexOf(curWord) == -1)
  {
    newPara += curWord + ' ';
    console.log(newPara);
  } else
  {
    i--;
  }

}

代码将一个段落分成一个单词数组(总共19个)。然后,我使用循环遍历此数组并随机选择一个单词,检查该单词是否已添加到newPara字符串中。如果还没有,我加上它。如果有,我从循环运行中减去1。问题是当我使用else语句从循环中减去一个脚本时,脚本会导致浏览器冻结。对此问题的任何帮助表示赞赏。

根据评论我做了这个编辑:

if(newPara.length <= words.length)
    {
    if(newPara.indexOf(curWord) == -1)
    {
      newPara += curWord + ' ';
      console.log(newPara);
    } else
    {
      i--;
    }
  }

但是,我仍然遇到同样的错误。

3 个答案:

答案 0 :(得分:2)

我想出的解决方案是从words.length向后工作到0,如果已经使用了该字,则从数组中删除该字。

Fiddle

&#13;
&#13;
var para = 'dashing through the snow' +
  ' in a one horse open sleigh' +
  ' over the fields we go' +
  ' laughing all the way';

function getRandomNumber(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

var words = para.split(' ');
var newPara = '';

for (var i = words.length; i > 0; i--) {

  var rand = getRandomNumber(0, words.length - 1),
    curr = words[rand];

  if (newPara.indexOf(curr) == -1) {
    newPara += curr + ' ';
    words.splice(rand, 1);
  }

}

console.log(newPara);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您正在创建的是无限循环。如果已经使用的单词被随机数生成器选择了2次,则循环计数器减去2.最后,当使用所有单词时(假设只选择1或2次),{{1总是小于i(因此,条件永远不会满足)。

一种可能的解决方案是将段落的长度保存在变量中并在循环条件中使用它。然后,对于您选择的每个单词,将其从words.length数组中删除。

这不会以无限循环结束,并且还会最小化迭代次数,因为在尝试查找单词时不会再有错误。

答案 2 :(得分:0)

试试这段代码:

var para = 'dashing through the snow' +
    ' in a one horse open sleigh' +
    ' over the fields we go' +
    ' laughing all the way';
var words, newPara = '';
console.log(para);

words = para.split(' ');

words.sort(function(a, b) {
    return 0.5 - Math.random();
});

newPara = words.join(' ');
console.log(newPara);

代码中的问题是para中的某些单词会重复多次,例如'the'这个词出现3次,它永远不会满足条件:i === words.length - 1

var  para = 'dashing through the snow' +
    ' in a one horse open sleigh' +
    ' over the fields we go' +
    ' laughing all the way';

您的随机数生成算法中也存在一个错误,这使得获取最后一个数字words[words.length-1]非常困难,将getRandomNumber(0, words.length - 1)更改为getRandomNumber(0, words.length)将使其正常工作。