с проблемой javascript циклической ссылки - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть функция createminor4 (arr, tourney), она в основном разбивает arr на 4 группы по 8 и заменяет их на tourney 1 группу за раз , оттуда это толкает в четыре {}, у которого есть 4 ключа с пустыми массивами.

Я прошел через это в chrome, и после первой толкания первой группы следующая группа перезаписывает предыдущую, хотя я Я нажимаю на разные клавиши в четыре {}. Я заканчиваю круговой ссылкой и не понимаю, что я делаю неправильно.

* createMinor4 () должен вернуть: four { "A":[["Lava Lamps", ..."shooters"],["a", "b"],["c", "d"],["e", "f"],["g"]], "B":[["Yellow Dragons", ... "water pistols"],["a", "b"],["c", "d"],["e", "f"],["g"]], "C":[["Snakes", ... "Hawks"],["a", "b"],["c", "d"],["e", "f"],["g"]], "D":[["Gamers", ... "worms"],["a", "b"],["c", "d"],["e", "f"],["g"]]}

let players4 = [
  "Lava Lamps", "Jarheads", "Cloud Gazerz", "Cobras", "Red Ravens", "Leaders", "Destroyers", "shooters",
  "Yellow Dragons", "Whales", "fearwolves", "Hitters", "red rebels", "Knights", "cute gremlins", "water pistols",
  "Snakes", "Ravens", "Chariots-of-Hell", "Predators", "Assassins", "Gladiators", "Broncos", "Hawks",
  "Gamers", "Slickers", "Freeze", "Rabbits", "Holy Rollers", "Crusaders", "FireHawks", "Worms"
]
let minorTourny = [
  ["t1", "t2"],
  ["t3", "t4"],
  ["t5", "t6"],
  ["t7", "t8"],
  ["a", "b"],
  ["c", "d"],
  ["e", "f"],
  ["g"]
];

function createMinor4(arr, tourney) {
  let q = arr.length * .25;
  let s = 0;
  let p = 1;
  let g = 4;
  let x = 0;
  let y = 0;
  let z = 0;

  let four = {
    "A": [],
    "B": [],
    "C": [],
    "D": []
  }
  //while 4 > 0
  while (g > s) {
    do {
      let loadTeam = tourney[x].splice(y, 1, arr[z]);
      if (z === 0) {
        loadTeam;
        y++;
      } else if (z % 2 == 0) {
        loadTeam;
        y = 1;
      } else if (z % 2 !== 0) {
        loadTeam;
        y = 0;
        x++;
      }
      z++;
    }
    while (z < q) // while 0 < 8
    if (g === 4) {
      four.A.push(tourney);
    } else if (g === 3) {
      four.B.push(tourney);
    } else if (g === 2) {
      four.C.push(tourney);
    } else if (g === 1) {
      four.D.push(tourney);
    }
    arr.splice(0, q)
    g--;
    p++;
    z = 0;
    x = 0;
    y = 0;
  }
  return four
}
console.log(createMinor4(players4, minorTourny))

1 Ответ

1 голос
/ 24 февраля 2020

Когда вы используете splice в массиве, он также изменит исходный массив, поэтому players4 и minorTourny не совпадают после createMinor4 вызова функции
Вы можете использовать Deep copy
Когда если вы используете глубокое копирование, у него больше не будет ссылки на исходный массив
Какой самый эффективный способ глубокого клонирования объекта в JavaScript?

let players4 = [
  "Lava Lamps", "Jarheads", "Cloud Gazerz", "Cobras", "Red Ravens", "Leaders", "Destroyers", "shooters",
  "Yellow Dragons", "Whales", "fearwolves", "Hitters", "red rebels", "Knights", "cute gremlins", "water pistols",
  "Snakes", "Ravens", "Chariots-of-Hell", "Predators", "Assassins", "Gladiators", "Broncos", "Hawks",
  "Gamers", "Slickers", "Freeze", "Rabbits", "Holy Rollers", "Crusaders", "FireHawks", "Worms"
]
let minorTourny = [
  ["t1", "t2"],
  ["t3", "t4"],
  ["t5", "t6"],
  ["t7", "t8"],
  ["a", "b"],
  ["c", "d"],
  ["e", "f"],
  ["g"]
];

function createMinor4(_arr, _tourney) {
  const arr = JSON.parse(JSON.stringify(_arr)); // Use Deep copy
  const tourney = JSON.parse(JSON.stringify(_tourney)); // Use Deep copy
  let q = arr.length * .25;
  let s = 0;
  let p = 1;
  let g = 4;
  let x = 0;
  let y = 0;
  let z = 0;

  let four = {
    "A": [],
    "B": [],
    "C": [],
    "D": []
  }
  //while 4 > 0
  while (g > s) {
    do {
      let loadTeam = tourney[x].splice(y, 1, arr[z]);
      if (z === 0) {
        loadTeam;
        y++;
      } else if (z % 2 == 0) {
        loadTeam;
        y = 1;
      } else if (z % 2 !== 0) {
        loadTeam;
        y = 0;
        x++;
      }
      z++;
    }
    while (z < q) // while 0 < 8
    if (g === 4) {
      four.A.push(tourney);
    } else if (g === 3) {
      four.B.push(tourney);
    } else if (g === 2) {
      four.C.push(tourney);
    } else if (g === 1) {
      four.D.push(tourney);
    }
    arr.splice(0, q)
    g--;
    p++;
    z = 0;
    x = 0;
    y = 0;
  }
  return four
}
console.log(createMinor4(players4, minorTourny))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...