处理对象数组并将它们以 4 个为一组进行分配
Processing an array of objects and assigning them in groups of 4
我正在尝试处理一个对象数组(代表游戏玩家),以根据其当前组值为每个对象分配组号。
问题是每个组应该有尽可能接近的四个玩家,有些玩家希望进入特定的组,这些组不能被打破(但可以重命名或合并)。
一些玩家有未分配/空组(他们不想与任何特定的人一起玩),而另一些玩家想与特定的人一起玩,因此他们有一个自定义的组值。
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 个组。
在伪代码中:
- 计算请求每个组名称的玩家数量。 这可以通过迭代
players
列表并更新字典/哈希表来线性时间完成。 - 将哈希表转换为数组并按组大小对其进行排序。
- 从数组的末尾开始,删除不需要修改的大小 4 组。
- 继续向后浏览数组,对于您找到的每个 size-3 组,从数组的开头(如果存在)将其组名称分配给未分配的玩家,并从数组中删除两者。
- 如果未分配的玩家筋疲力尽,并且有多余的 3 大小组,请将其删除(他们必须保持原样)。
- 继续向后浏览数组,对于找到的每对大小为 2 的组,为它们分配相同的组名并将它们从数组中删除。
- 您现在最多将有一个 2 号组,可能还有更多未分配的玩家。 将它们收集成 4 个一组。
- fluxxor向一个flux实例添加一组以上的操作
- 我们怎样才能将内含子J用于一组特定的元素
- 使用linq.js按当前日期订购一组momentjs日期
- 正则表达式,从一组关键字中获取奇数
- 创建一组元素JointJS
- 如何在javascript中获取一组复选框值
- 一组(共组..)
- 使用JS将页面中的每个字母设置为随机颜色.为什么在页面的每个打开标记之前总是有一组额外的span标记
- 使用mysql为JSON php数组分配多个列值
- 在一组复选框中,一次只允许选择一个
- 为什么在fabricjs中可选择的不适用于一组圆
- 如何在不刷新页面的情况下每次单击一组选项卡时刷新视图内容窗格
- 从一组具有相同起始和结束的所有段落的段落中提取包含特定字符串的段落
- 简单的Javascript文本编辑器或一组函数
- 基于日期范围的一组日期范围内的天数
- 处理对象数组并将它们以 4 个为一组进行分配
- 如何在 Javascript 中用一组字符拆分子字符串上的字符串
- 使一组对象与 jQuery 一起拖动
- 如何将概率(均匀递增或递减线性分布)分配给一组值
- 是否可以使用类名将端点分配给一组元素