我有一个元素数组,它们具有公共属性并按此属性排序。现在,我想达到相反的效果:尽可能地交错具有相同属性值的元素。
[
{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
就会停止。
我该怎么做?
答案 0 :(得分:1)
所以你最初的方法就像是
x.group_by { | e | e[:a] }.values.inject(&:zip).flatten
如果组的元素少于早期组,则失败。
想法是在第一个数组太短时切换它们(之后用nil
移除compact
):
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