while循环崩溃浏览器

时间:2016-09-24 17:04:36

标签: javascript jquery

我的Javscript函数时不时地破坏浏览器。很少次它崩溃,但是你有那些时间,当它发生时。使用firebug看起来像是while循环崩溃了一切。有人有任何想法吗?

function generateTeams(pos = 0) {
  // Array of ID's
  var currentTeams = [];
  // 2D array with matches and teamIds
  var matches = [];

  $.each($teamList, function () {
    // Push integer into a new array
    if (this.position >= pos) currentTeams.push(this.id);
  });

  // NumberOfTeams is ALWAYS even numbers, and can be divided by 2
  var numberOfTeams = currentTeams.length;
  var numberOfMatches = numberOfTeams / 2;

  if ((numberOfTeams > 2) && (numberOfTeams % 2 == 0)) {
    var currentCount = numberOfTeams;

    for (var i = 0; i < numberOfMatches; i++) {
      var numOne = Math.floor(Math.random() * currentCount);
      var numTwo = Math.floor(Math.random() * currentCount);

      // Checks if the numbers are the same, or if two spesific teams is against each-other. 
      while ((numOne == numTwo) || (currentTeams[numOne] == 1 && currentTeams[numTwo] == 3) || (currentTeams[numOne] == 3 && currentTeams[numTwo] == 1)) {
        numTwo = Math.floor(Math.random() * currentCount);
      }

      // Creates a match-array with the two team ID's
      matches.push([parseInt(currentTeams[numOne]), parseInt(currentTeams[numTwo])]);

      // Simple way to remove them from the start-array.
      if (numOne > numTwo) {
        currentTeams.splice(numOne, 1);
        currentTeams.splice(numTwo, 1);
      } else {
        currentTeams.splice(numTwo, 1);
        currentTeams.splice(numOne, 1);
      }

      currentCount -= 2;
    } // End for-loop
  } else {
    matches.push([parseInt(currentTeams[0]), parseInt(currentTeams[1])]);
  } // End if

  currentMatches = matches;
} // End generateTeams

1 个答案:

答案 0 :(得分:2)

首先,使用非确定性运行时具有这样的while循环并不是一个好主意。它可以并且在统计上需要花费很长时间才能完成。

此外,还有一个条件是无法完成:当第1队和第3队保持到最后时,它永远不会终止。由于你可能没有很多的团队,这种情况会经常发生。

幸运的是,while循环对于解决给定问题根本不是必需的:更改代码,以便在for循环中,首先选择匹配的第一个团队,从currentTeams中删除它,然后选择第二个团队一个来自剩下的球队。这样,两次选择同一个团队是不可能的。

如果您确实需要两个特殊团队的条件:首先从currentTeams中删除它们。然后为其中一个选择一个对手,这是你的第一场比赛。然后将第二个特殊团队放回到列表中,并按照之前的描述确定其余的匹配。