我有一个元素数组,它们有一个共同的属性,并按这个属性排序。现在,我想达到相反的效果:尽可能地交错具有相同属性值的元素。
[
{a: 1},
{a: 1},
{a: 2},
{a: 2},
{a: 2},
{a: 3},
{a: 3},
{a: 3},
{a: 3},
].scatter_somehow
# =>
[
{a: 3},
{a: 1},
{a: 2},
{a: 3},
{a: 2},
{a: 1},
{a: 3},
{a: 2},
{a: 3},
]
如果 a
的每个值都有相同数量的元素,我可以将它们分组,然后压缩数组并展平结果。但是 Array#zip
在最小数组中没有元素时立即停止。
我该怎么做?
最佳答案
所以你最初的方法是这样的
x.group_by { | e | e[:a] }.values.inject(&:zip).flatten
如果一个组的元素少于之前的组,则失败。
想法是如果第一个数组太短就切换它们(之后用 compact
删除 nil
):
x.group_by { | e | e[:a] }.values.inject do | a, e |
if a.length < e.length
e.zip(a)
else
a.zip(e)
end
end.flatten.compact
关于arrays - 如何分散 Ruby 数组的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30913630/