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人以上的群体:无法容纳这些群体,您必须就如何应对这些群体做出决策。从现在起,我将忽略他们
players
列表上迭代并更新字典/哈希表在线性时间内完成这是非常具体的项目。试着把问题分解成更小的子问题,然后当你意识到哪个子问题是你不能解决的,回来更新问题。你想要代码还是一个算法?我甚至不知道从哪里开始。任何算法指导都将不胜感激。我现在在摆弄加尔·戈弗雷的建议。