xXH4CKST3RXx Ответов: 1

Проблема, связанная с областью действия в 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-на игроках.

1 Ответов

Рейтинг:
1

Richard MacCutchan

let players = [myGlobalVars.player1, myGlobalVars.player2, myGlobalVars.player3, myGlobalVars.player4, myGlobalVars.player5, myGlobalVars.player6, myGlobalVars.player7, myGlobalVars.player8]

Вы создали массив игроков, но ни один из игроков не определен на данный момент. Поэтому, когда вы пытаетесь ссылаться на отдельные объекты, они равны нулю.
Вы должны определить каждого отдельного игрока перед созданием массива игроков.


[no name]

Если я сделаю то, что вы говорите, мне придется поставить ranNums после игроков, и это вызовет еще одну ошибку, потому что свойство .teamNum каждого игрока основано на ranNums, а ranNums-на игроках.

Richard MacCutchan

Затем вам нужно переосмыслить свой дизайн, чтобы заставить его работать.