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

Processing an array of objects and assigning them in groups of 4

本文关键字:一组 分配 数组 对象 处理      更新时间:2023-09-26

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

问题是每个组应该有尽可能接近的四个玩家,有些玩家希望进入特定的组,这些组不能被打破(但可以重命名或合并)。

一些玩家有未分配/空组(他们不想与任何特定的人一起玩),而另一些玩家想与特定的人一起玩,因此他们有一个自定义的组值。

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}
]

您可以看到,如果可能的话,前四名玩家应该被分配到第 1 组,而最初拥有自定义组的玩家将被合并为四人组 - 否则,他们应该让一些"空"组玩家组成尽可能接近的四个玩家在一个组中。组的名称并不重要,重要的是指定自定义组的每个玩家都应该能够与初始组成员保持联系,即使他们与另一个自定义组合并。

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

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

2) 按该大小创建一个组数组。这可能就像每个组中玩家计数的数组一样简单。

3) 按组名对玩家列表进行排序(使用排序和自定义比较功能)。

4)浏览排序列表,对于每个组名,计算该组中的玩家数量,找到一个可容纳这么多玩家的组,并将他们全部添加到该组中。

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

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

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

当然,大小为 4 的组可以保持原样。

大小为 2 的组可以相互配对 - 如果有奇数个这样的组,您将在最后剩下一组。

大小为 3 的组可以与未分配的玩家配对。 在此步骤之后,您将拥有一些剩余的 3 大小组或一些剩余的未分配玩家,但不能两者兼而有之。 如果您有多余的 3 号组,则必须保持原样。

如果您有多余的未分配玩家(可能还有一个剩余的 2 号组),您可以相对轻松地将他们收集成 4 个组。

在伪代码中:

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