Javascript 处理一组对象并将其按4组分配

Javascript 处理一组对象并将其按4组分配,javascript,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

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

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 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的组
  • 三人一组
  • 大小为4的组
  • 5人或5人以上的群体:无法容纳这些群体,您必须就如何应对这些群体做出决策。从现在起,我将忽略他们
当然,大小为4的组可以保持原样

大小为2的组可以相互配对-如果这类组的数量为奇数,则最后会剩下一组

大小为3的组可以与未分配的玩家配对。在这一步之后,你将有一些剩余的3号组或一些剩余的未分配玩家,但不是两者都有。如果你有多余的3人组,你只能让他们保持原样

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

在伪代码中:

  • 计算请求每个组名称的玩家数量。这可以通过在
    players
    列表上迭代并更新字典/哈希表在线性时间内完成
  • 将哈希表转换为数组并按组大小对其排序
  • 从阵列的末尾开始,删除不需要修改的大小为4的组
  • 继续向后遍历数组,对于找到的每个大小为3的组,从数组开始(如果存在)将其组名分配给未分配的玩家,并从数组中删除这两个组
  • 如果未分配的玩家已经筋疲力尽,并且有多余的3人组,则将其移除(他们必须保持原样)
  • 继续向后遍历数组,对于找到的每对大小为2的组,为它们指定相同的组名并将其从数组中删除
  • 你现在最多会有一个2号组,可能还有更多未分配的玩家。将它们分成4组

  • 这是非常具体的项目。试着把问题分解成更小的子问题,然后当你意识到哪个子问题是你不能解决的,回来更新问题。你想要代码还是一个算法?我甚至不知道从哪里开始。任何算法指导都将不胜感激。我现在在摆弄加尔·戈弗雷的建议。