如何在Javascript中使用多维数组?

4
我正在尝试编写一个像这样的代码:
  1. 获取团队数量(y)和球员数量(x)。
  2. 获取 x 个名称和排名。
  3. 根据球员排名创建平衡的团队。每个团队应该有 x/y 名球员。
  4. 单独打印每个团队。
我不知道我的问题在哪里,也不知道为什么我的代码无法运行。希望你们能帮忙看一下。
这是我的代码:

function step1() {
 var teams = document.getElementById("teams").value;
 var players = document.getElementById("players").value;
 var main = document.getElementById("main");
 main.innerHTML="";
 for(var i=1;i<=players;i++){ 
  main.innerHTML += "<input class='names' placeholder='Player "+i+"' type='text' style='width:100px'/>   "+ 
  "<input class='ranks' placeholder='Rank' type='text' style='width:40px'/><br/>";
 }
 main.innerHTML+="<br/><button onclick='buildTeams("+players+","+teams+")'>Build</button>";
}
function buildTeams(playersInt,teamsInt) {
 var error=0;
 var names = new Array(playersInt); 
 var ranks = new Array(playersInt);
 var nameInp = document.getElementsByClassName("names"); 
 var rankInp = document.getElementsByClassName("ranks");
 for(var i=0;i<playersInt;i++) {
  names[i] = nameInp[i].value; 
 }
 for(var i=0;i<playersInt;i++) {
  ranks[i] = rankInp[i].value;
 }
 var teams = new Array(teamsInt);
 for(var i=0;i<teamsInt;i++) {
  teams[i]=new Array(playersInt/teamsInt);
 }
 for(var i=0;i<(playersInt/teamsInt);i++) {
  for(var j=0;j<teamsInt;j++) {
   teams[i][j]=names[checkMvp(ranks)];
   ranks[checkMvp(ranks)]=-1;
  }
 }
 for(var i=0;i<teamsInt;i++) {
  alert(teams[i]);
 }

}
function checkMvp(ranks) {
 var high= ranks[0];
 var bpi=0;
 for(var i=1;i<ranks.length;i++) {
  if(ranks[i]>high) {
   bpi=i;
  }
 }
 return bpi;
}
<h2>Power Balance</h2>
<div id="main">
Number of teams:
<input type="text" id="teams" style="width:30px"/> 
<br/><br/>
Number of players:
<input type="text" id="players" style="width:30px"/> 
<br/><br/>
<p id="error"></p>
<input type="button" onclick="step1()" value="Next"/>
</div>


teams[i] = new Array(playersInt / teamsInt); 抛出范围错误:无效的数组长度。 - Jonathan
@Jonathan 这怎么可能呢?长度应该没问题啊。我应该写些什么? - rondeitch
@rondeitch 尝试使用1个球员的2个团队。 - cychoi
@cychoi 好的,我忘记检查验证了。但是在我添加了验证之后,为使这段代码工作,我需要做什么? - rondeitch
1个回答

1

请查看我的解决方案。它应该能够正常工作。你错误地交换了将玩家添加到队伍的循环逻辑。此外,使用Array.prototype.push比在使用new Array(length)创建数组后再使用循环函数创建新元素更好。

function step1() {
    var teams = document.getElementById("teams").value;
    var players = document.getElementById("players").value;
    var main = document.getElementById("main");
    main.innerHTML="";
    for(var i=1;i<=players;i++){ 
        main.innerHTML += "<input class='names' placeholder='Player "+i+"' type='text' style='width:100px'/>   "+ 
        "<input class='ranks' placeholder='Rank' type='text' style='width:40px'/><br/>";
    }
    main.innerHTML+="<br/><button onclick='buildTeams("+players+","+teams+")'>Build</button>";
}
function buildTeams(playersInt,teamsInt) {
    var error=0;
    var names = []; 
    var ranks = [];
    var nameInp = document.getElementsByClassName("names"); 
    var rankInp = document.getElementsByClassName("ranks");
    for(var i=0;i<playersInt;i++) {
        names.push(nameInp[i].value);   
    }
    for(var e=0;e<playersInt;e++) {
        ranks.push(rankInp[e].value);
    }
    var teams = [];
    for(var x=0;x<teamsInt;x++) {
        teams.push([]);
    }
    for(var a=0;a<teamsInt;a++) {
        for(var j=0;j<(playersInt/teamsInt);j++) {
            console.log(teams[a]);
            teams[a].push(names[checkMvp(ranks)]);
            ranks[checkMvp(ranks)]=-1;
        }
    }
    alert(teams);
    for(var w=0;w<teamsInt;w++) {
        alert(teams[w]);
    }

}
function checkMvp(ranks) {
    var high= ranks[0];
    var bpi=0;
    for(var i=1;i<ranks.length;i++) {
        if(ranks[i]>high) {
            bpi=i;
        }
    }
    return bpi;
}

你应该在你的回答中包含相关的代码,那样即使链接失效了,这个回答仍然是有效的。 - sharf
@Bwaxxlo 非常感谢您!您的回答非常有帮助。虽然,如果我们每次总结每个组的排名,我们可以看到排名之间存在巨大的差异 - 因此团队并不平衡。我尝试了数小时来编写一个平衡团队的代码。你有什么想法吗? - rondeitch
@rondeitch 创建一个平衡的团队是算法设计和排名相对性的问题。它们是自我描述的排名还是您也设计了自己的排名算法。如果排名是预先确定的(即:您的决定),那么设计一个算法就很简单了。确保两边距离平均值相等(至少尽可能接近)。基本上,确保两组之间的差异标准偏差最小化。如果排名是自我规定的,那么这就是另一个数据挖掘问题。 - Bwaxxlo
@Bwaxxlo 每个团队的排名是所有球员排名的总和。球员的排名在1-10之间。我检查了现有的代码,它给出了最多相差10分的团队,但我希望通过一种平衡团队排名的方式将球员从一个团队转移到另一个团队。 - rondeitch
@Bwaxxlo,你有没有想过如何使用你为我编写的代码来实现它?感谢你的帮助! - rondeitch
@rondeitch 排名是如何分配的?它们是基于可用数据(即:玩家之前已经玩过并晋升了)还是玩家必须声明他们自认为的排名? - Bwaxxlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接