处理对象数组并以4个为一组进行分配

时间:2015-03-16 03:33:01

标签: javascript

我正在尝试处理一组对象(代表游戏玩家),根据当前的组值为每个对象分配一个组号。

问题在于每个小组应该尽可能接近四个玩家,并且一些玩家希望成为特定的小组,这些小组不得被打破(但可以重命名或合并)。

有些玩家有未分配/无效的群组(他们不想与特定的人玩游戏)而其他玩家想要与特定的人玩游戏,以便他们拥有自定义群组价值。

var players = [
    {name: "A", group: null},
    {name: "B", group: null},
    {name: "C", group: null},
    {name: "D", group: null},
    {name: "E", group: null},
    {name: "cA", group: "custom1"},
    {name: "cB", group: "custom1"},
    {name: "cC", group: "custom2"},
    {name: "cD", group: "custom2"},
    {name: "cE", group: "custom3"},
    {name: "cF", group: "custom3"}];

我需要一种方法来解析这个数组,以便它返回如下内容:

var resolvedGroup = [
    {name: "A", group: 1},
    {name: "B", group: 1},
    {name: "C", group: 1},
    {name: "D", group: 1},
    {name: "cA", group: "customMerged1"},
    {name: "cB", group: "customMerged1"},
    {name: "cC", group: "customMerged1"},
    {name: "cD", group: "customMerged1"},
    {name: "cE", group: 2},
    {name: "cF", group: 2},
    {name: "E", group: 2}
]

你可以看到前四个玩家应该被分配到第一组,而最初拥有自定义组的玩家会被合并为四个一组,如果可能的话 - 否则,他们应该得到一些" null&# 34;分组玩家尽可能在一组中形成接近四名玩家。这些组的名称并不重要,只有指定自定义组的每个玩家都应该能够与初始组成员保持联系,即使他们与另一个自定义组合并。

2 个答案:

答案 0 :(得分:1)

这需要几个步骤和相当数量的编码。您可能需要尝试各种方法并提出最佳解决方案。我会从:

开始

1)根据玩家数量确定您需要多少组。最有可能的是Math.ceil(numPlayers / 4);

2)按该大小创建一组组。这可能就像每组中球员数量的数组一样简单。

3)按组名对播放器列表排序(使用排序和自定义比较功能)。

4)浏览排序列表,对于每个组名,计算该组中的玩家数量,找到一个有足够多个玩家空间的组,并将它们全部添加到该组中。

5)浏览剩下的玩家,将每个玩家添加到一个组中。我会从组数组的末尾开始,在添加每个播放器后向后移动,当它到达开头时循环回到组数组的末尾。

答案 1 :(得分:1)

请求的群组将属于以下类别之一:

  • 没有请求群组的玩家,以及(可能)大小为1的群组(可以视为他们没有请求群组)。
  • 规模为2的团体。
  • 3人组。
  • 4人组。
  • 5人或以上的团体:这些团体无法容纳,您必须就如何处理这些团体做出政策决定。我会在这里忽略它们。

当然,4号组可以原样保留。

大小为2的组可以相互配对 - 如果这些组中有奇数个组,则最后会留下一组。

3号组可以与未分配的玩家配对。在此步骤之后,您将拥有一些剩余的3号组或一些剩余未分配的球员,但不是两者。如果你有3个剩余的3组,那么你必须保持原样。

如果你有剩余未分配的玩家(可能还有一个剩余的2号组),你可以相对容易地将它们分成4组。

在伪代码中:

  1. 计算请求每个组名的玩家数量。这可以通过迭代players列表并更新字典/哈希表来在线性时间内完成。
  2. 将哈希表转换为数组并按组大小排序。
  3. 从数组末尾开始,删除不需要修改的size-4组。
  4. 继续向后遍历数组,对于您找到的每个size-3组,将其组名从数组的开头(如果存在)分配给未分配的播放器,并从阵列中删除它们。
  5. 如果未分配的玩家已经筋疲力尽并且有超过3个组的剩余,请将其删除(他们必须保持原样)。
  6. 继续向后遍历数组,对于找到的每对size-2组,为它们分配相同的组名并从阵列中删除它们。
  7. 您现在最多只有一个2号组,可能还有更多未分配的玩家。将它们收集成4个小组。