我的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
答案 0 :(得分:2)
首先,使用非确定性运行时具有这样的while循环并不是一个好主意。它可以并且在统计上需要花费很长时间才能完成。
此外,还有一个条件是无法完成:当第1队和第3队保持到最后时,它永远不会终止。由于你可能没有很多的团队,这种情况会经常发生。
幸运的是,while循环对于解决给定问题根本不是必需的:更改代码,以便在for循环中,首先选择匹配的第一个团队,从currentTeams中删除它,然后选择第二个团队一个来自剩下的球队。这样,两次选择同一个团队是不可能的。
如果您确实需要两个特殊团队的条件:首先从currentTeams中删除它们。然后为其中一个选择一个对手,这是你的第一场比赛。然后将第二个特殊团队放回到列表中,并按照之前的描述确定其余的匹配。