【问题标题】:having a javascript circular reference issue有 javascript 循环引用问题
【发布时间】:2020-02-24 04:52:40
【问题描述】:

我有一个函数 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))

【问题讨论】:

    标签: javascript arrays object circular-reference


    【解决方案1】:

    当您在数组上使用splice 时,它也会更改原始数组,这就是为什么您在createMinor4 函数调用后players4minorTourny 不一样
    您可以使用Deep copy
    当您使用深拷贝时,它将不再具有原始数组的引用
    What is the most efficient way to deep clone an object in 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))

    【讨论】:

    • 谢谢,我试了一下,但仍然是同样的问题。然而,很高兴知道深拷贝。我已经更新了我的问题,使其更加清晰。
    • 其实可以,只是需要在后面的代码中声明。就在控制 .push() 的 if 语句之前。再次感谢。
    猜你喜欢
    • 2016-03-22
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多