【问题标题】:What's the difference between a hardcoded javascript array and one generated by code?硬编码的 javascript 数组和由代码生成的数组有什么区别?
【发布时间】:2020-03-28 16:36:00
【问题描述】:

非常新手,我的夹具和联赛表程序可以很好地处理硬编码的夹具,但尝试使用更灵活的代码逐轮构建夹具却破坏了它。

您会看到我已经编写了这两种方法,并使用标志 'hardFix' 来确定固定装置的构建方式。

  var players = ["P1", "P2", "P3"];

  var Fixtures = [];

  var rounds = 3;

  var hardFix = false;

  function buildFixtures() {
    if (hardFix == true) {

      Fixtures = [
        [players[0], , , players[1]],
        [players[0], , , players[2]],
        [players[1], , , players[2]],
        [players[1], , , players[0]],
        [players[2], , , players[0]],
        [players[2], , , players[1]],
        [players[0], , , players[1]],
        [players[0], , , players[2]],
        [players[1], , , players[2]],
        [players[1], , , players[0]],
        [players[2], , , players[0]],
        [players[2], , , players[1]],
      ];
    } else {

      let oddRound = [
      [players[0],,,players[1]],
        [players[0],,,players[2]],
        [players[1],,,players[2]]
      ];

      let evenRound = [
      [players[1],,,players[0]],
        [players[2],,,players[0]],
        [players[2],,,players[1]]
      ];
      for (let i = 1; i <= rounds; i++) {
        if (i & 1) {
            Array.prototype.push.apply(Fixtures, oddRound);
        } else {
            Array.prototype.push.apply(Fixtures, evenRound);
        }
    }

   }
  }


您将在下面看到:

  • 两轮没问题
  • 当有更多时,第一轮变得“不可见”
  • 最终夹具的结果被复制(请参阅下表中的整个数组)

我相信这与我构建的数组的结构有关。任何建议表示赞赏。在此先感谢

【问题讨论】:

  • 这不正是您 6 天前提出的问题吗?到底什么是“夹具”?
  • 在不知道最终目标是什么的普通语言或伪代码的情况下,不可能修复逻辑错误。支持 Pointy 关于什么是夹具的评论?另外,如果您可以提供有关“游戏规则”的一些​​上下文。
  • @Pointy 这是该问题的另一个方面。我的问题集中在数组结构而不是代码本身。我将在上面澄清“夹具”的含义。
  • 请准确告诉我们这段代码应该做什么,它正在做什么,以及你做了什么来尝试找出它为什么不起作用。我不明白为什么您的数组中间有空条目,尤其是当您修改它们的唯一方法是推到末尾时。
  • 当您从oddRoundevenRound 动态构建表时,请了解将它们推入目标数组不会复制。如果您稍后操作目标中的子数组,您将为多个目标行更改相同的数组。您可以.push(oddRound.slice()) 推送这些源数组的副本。

标签: javascript arrays push


【解决方案1】:

根据@Pointy 的评论,该问题可能是由于重复附加相同的行集(oddRoundevenRound)造成的——当您更改这些行中的值时,所有其他行也会更改。 (但是我不确定你的输出是如何由这个问题单独产生的,所以在你的代码中没有显示的部分可能还有其他问题。)

解决这个问题的一种方法是使用一个单独的函数来列出数组的所有配对 - 如果您以后需要超过 3 个玩家,这是一个更灵活的解决方案。

function pairs(arr) {
    // Return list of all pairs of values in an array
    const r = [];
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            r.push([arr[i], arr[j]]);
        }   
    }
    return r;
}

function buildFixtures(rounds, players) {
    const pairings = pairs(players),
        r = [];
    for (let i = 0; i < rounds; i++) {
        for (const [first, second] of pairings) {
            if (i % 2) {   // odd round
                r.push([second,,,first]);   
            } else {        // even round
                r.push([first,,,second]);
            }
        }
    }        
    return r;
}
let players = ["P1", "P2", "P3"],
    rounds = 3,
    fixtures = buildFixtures(rounds, players);

【讨论】:

  • 这太棒了!增加更多的球员也是我名单上的下一个。这很有启发性,我将学习更多实现这一点 - 再次感谢@Stuart
猜你喜欢
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多