Проблема, связанная с областью действия в javascript. Не могу найти способ избавиться от ошибки. Нужен другой ответ.
I can't seem to find a way to get rid of an error. It is always "cannot read property TeamNum of undefined." I know it has something to do with scope. Here is the code:
let myGlobalVars = {} // sets up teams array and individual teams let team1 = []; myGlobalVars.team1 = team1; let team2 = []; myGlobalVars.team2 = team2; let team3 = []; myGlobalVars.team3 = team3; let team4 = []; myGlobalVars.team4 = team4; let teams = [myGlobalVars.team1, myGlobalVars.team2, myGlobalVars.team3, myGlobalVars.team4]; myGlobalVars.teams = teams; let teamNumsArray = Array.apply(null, {length: myGlobalVars.teams.length}).map(Function.call, Number); myGlobalVars.teamNumsArray = teamNumsArray; // function for random numbers is copied from Ben Jackson on https://stackoverflow.com/questions/18806210/generating-non-repeating-random-numbers-in-js function shuffle(array) { let i = array.length, j = 0, temp; while (i--) { j = Math.floor(Math.random() * (i+1)); // swap randomly chosen element with current element temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } // formula replicateArray is copied from https://stackoverflow.com/questions/30228902/duplicate-an-array-an-arbitrary-number-of-times-javascript function replicateArray(array, n) { // Create an array of size "n" with undefined values let arrays = Array.apply(null, new Array(n)); // Replace each "undefined" with our array, resulting in an array of n copies of our array arrays = arrays.map(function() { return array }); // Flatten our array of arrays return [].concat.apply([], arrays); } // formula to make teamNumsArray is copied from http://www.jstips.co/en/javascript/create-range-0/.n-easily-using-one-line/ let players = [myGlobalVars.player1, myGlobalVars.player2, myGlobalVars.player3, myGlobalVars.player4, myGlobalVars.player5, myGlobalVars.player6, myGlobalVars.player7, myGlobalVars.player8] myGlobalVars.players = players; let ranNums = shuffle(replicateArray(myGlobalVars.teamNumsArray, (myGlobalVars.players.length/teams.length))); myGlobalVars.ranNums = ranNums; // sets up players let player1 = { name: "A", teamNum: myGlobalVars.ranNums[0] } myGlobalVars.player1 = player1; let player2 = { name: "B", teamNum: myGlobalVars.ranNums[1] } myGlobalVars.player2 = player2; let player3 = { name: "C", teamNum: myGlobalVars.ranNums[2] } myGlobalVars.player3 = player3; let player4 = { name: "D", teamNum: myGlobalVars.ranNums[3] } myGlobalVars.player4 = player4; let player5 = { name: "E", teamNum: myGlobalVars.ranNums[4] } myGlobalVars.player5 = player5; let player6 = { name: "F", teamNum: myGlobalVars.ranNums[5] } myGlobalVars.player6 = player6; let player7 = { name: "G", teamNum: myGlobalVars.ranNums[6] } myGlobalVars.player7 = player7; let player8 = { name: "H", teamNum: myGlobalVars.ranNums[7] } myGlobalVars.player8 = player8; // sets up players array function assignPlayers() { for (let i = 0; i < teams.length; i++) { for(let j = 0; j < players.length; j++) { if(players[j].teamNum === i) { teams[i].push(players[j].name) } } } console.log(team1) console.log(team2) console.log(team3) console.log(team4) } assignPlayers()
Если вы хотите поработать над этим на GitHub вот РЕПО с кодом:
РЕПО
Что я уже пробовал:
Я попытался перестроить код, чтобы избавиться от ошибок, но появлялись разные ошибки, связанные с областью действия.
Сначала я попытался создать объект, который будет содержать все объекты, которые я хотел бы использовать в любом месте кода, даже если переменная еще не была объявлена в глобальном пространстве, но это тоже не сработало. Объект, чтобы провести все глобальные переменные, называется myGlobalVars.
MadMyche
Извините, я не собираюсь выходить за пределы сайта, чтобы перемещаться по всему вашему коду
[no name]
Извините, я постараюсь вложить весь код в этот вопрос.
[no name]
@Richard MacCutchan если я сделаю то, что вы говорите, мне придется поставить ranNums после игроков, и это вызовет еще одну ошибку, потому что свойство .teamNum каждого игрока основано на ranNums, а ranNums-на игроках.