如何将在 for 循环中选中的复选框中的数组值推送到另一个数组?

How can I push array values checked in checkboxes made from a for loop to another array?

出于我正在做的事情的目的,我使用了一个 for 循环来从之前的数组创建复选框,而不是通过 html 来创建复选框。此循环从玩家数组中获取对象的 .name 值,并将其显示为一个复选框,如果该玩家想玩,则可以选中该复选框。

let playing = [];//8 players maximum

//array displayed as check boxes
var players = [
  {"name": "Tyler", "score": 4},
  {"name": "Nick", "score": 4},
  {"name": "Patrick score 3", "score": 3},
  {"name": "Jack", "score": 3},
  {"name": "Aboss", "score": 3},
  {"name": "Colin", "score": 1}, 
  {"name": "Sling", "score": 1},
  {"name": "Joe", "score": 2},
  {"name": "Terrrence", "score": 2},
  {"name": "Scott", "score": 4},
]

//loop to display players[] as checkboxes
var myDiv = document.getElementById("cboxes");

for (var i = 0; i < players.length; i++) {
    var checkBox = document.createElement("input");
    var label = document.createElement("label");
    checkBox.type = "checkbox";
    checkBox.value = players[i];
    myDiv.appendChild(checkBox);
    myDiv.appendChild(label);
    label.appendChild(document.createTextNode(players[i].name));
}

我无法弄清楚如何将对象从选定的框中推送到一个名为 playing 的新数组(或至少是名称值),因为稍后我将需要使用与名称关联的 .score 值以及。如果选择的玩家多于或少于 8 人,我还想包含一条错误消息。 我有一个 html 按钮:

<button onclick="checkCheckbox()">Push to playing array</button> <br>   

这是我按下按钮时的占位符函数:

function checkCheckbox(){
  playing.push(document.getElementById("cboxes"));
}

谢谢书呆子们

如果我没有正确理解你的问题,请将玩家姓名和分数推送到 playing 数组。

如果您想将分数设置为每个复选框的值,您需要使用 .score 指定它 checkBox.value = players[i].score

let playing = [];//8 players maximum

//array displayed as check boxes
let players = [
  {"name": "Tyler", "score": 4},
  {"name": "Nick", "score": 4},
  {"name": "Patrick", "score": 3},
  {"name": "Jack", "score": 3},
  {"name": "Aboss", "score": 3},
  {"name": "Colin", "score": 1}, 
  {"name": "Sling", "score": 1},
  {"name": "Joe", "score": 2},
  {"name": "Terrrence", "score": 2},
  {"name": "Scott", "score": 4},
]

//loop to display players[] as checkboxes
let myDiv = document.getElementById("cboxes");

for (let i = 0; i < players.length; i++) {
    let checkBox = document.createElement("input");
    let label = document.createElement("label");
    checkBox.type = "checkbox";
    checkBox.value = players[i].score;
    checkBox.id = 'player-'+i;
    label.htmlFor = 'player-'+i;
    myDiv.appendChild(checkBox);
    myDiv.appendChild(label);
    label.appendChild(document.createTextNode(players[i].name));
}

function checkCheckbox(){

  let checkedPlayers = document.querySelectorAll('#cboxes input');
  let amountOfPlayers = 0;
  playing = [];
  
  for(let i = 0; i < checkedPlayers.length; i++){
    if(checkedPlayers[i].checked){
        amountOfPlayers++;
      playing.push(
        {"name": checkedPlayers[i].nextSibling.textContent,
         "score":checkedPlayers[i].value
        }
      )
    }
  }
  
  if(amountOfPlayers != 8){
    let errMessage = amountOfPlayers < 8 ? 'You only selected '+amountOfPlayers+ ' players, make sure to select 8 players' : 'You have selected too many players (8 max).';
    alert(errMessage);
  } else {
    alert('All good, 8 players have been selected, time to play!');
    // we have our 8 players:
    console.log(playing);
  }
}
<div id="cboxes"></div>

<button onclick="checkCheckbox()">Push to playing array</button> <br>

以下内容应该可以实现您的所有目标!

需要注意的一件事是,每次按下按钮时,该函数都会擦除正在播放的数组并从一个空数组填充它,我认为这比检查数组中的重复对象要容易得多。

let playing = [];//8 players maximum

//array displayed as check boxes
const players = [
  {"name": "Tyler", "score": 4},
  {"name": "Nick", "score": 4},
  {"name": "Patrick", "score": 3},
  {"name": "Jack", "score": 3},
  {"name": "Aboss", "score": 3},
  {"name": "Colin", "score": 1}, 
  {"name": "Sling", "score": 1},
  {"name": "Joe", "score": 2},
  {"name": "Terrrence", "score": 2},
  {"name": "Scott", "score": 4},
]

//loop to display players[] as checkboxes
const myDiv = document.getElementById("cboxes");

for (let i = 0; i < players.length; i++) {
    let checkBox = document.createElement("input");
    let label = document.createElement("label");
    
    checkBox.type = "checkbox";
    checkBox.value = players[i]['score'];
    checkBox.name = players[i]['name'];
    
    myDiv.appendChild(label);
    label.appendChild(checkBox);
    label.appendChild(document.createTextNode(players[i].name));
}

function checkCheckbox() {
  const checkedInputs = myDiv.querySelectorAll('input[type="checkbox"]:checked');
  
  playing = [];
  
  for (let i = 0; i < checkedInputs.length; i++) {
      if (i < 8) {
        playing.push({"name": checkedInputs[i].name, "score": checkedInputs[i].value});
      }
  }
  
  console.log(playing);
}
<div id="cboxes"></div>

<button onclick="checkCheckbox()">Push to playing array</button> <br>