Ruby のハッシュ配列を分割する方法
概要
ハッシュの配列を分割したいです。
.split は機能しません。
順序を維持しながら 2 つに分割したいので、.partition、.select、group_by は機能しない可能性があります。
これから何か
allay = [
{name: "Iron Man", power: "Tech"},
{name: "Spiderman", power: "Iron Man as Uncle"},
{name: "Thor", power: "God"},
{name: "Hawk Eye", power: "None"},
{name: "Black Widow", power: "love her"}
]
これを出力として
=> [
[
{name: "Iron Man", power: "Tech"},
{name: "Spiderman", power: "Iron Man as an Uncle"},
{name: "Thor", power: "God"}
],
[
{name: "Hawk Eye", power: "None"},
{name: "Black Widow", power: "love her <3"}
]
]
解決策
Enumerable#each_slice を使用して、必要な動作を取得できます。
left, right = allay
.each_slice(allay.length.succ / 2)
.to_a
もちろん他の方法もありますが、それほど良いものではありません。もう一つは次のとおりです。
pivot = allay.length.succ / 2
left, right = allay
.partition
.with_index { |_, i| i < pivot }
そしてもう一つ:
left, right = [], allay.dup
left << right.shift until left.length >= right.length
ベンチマーク!
each_slice 785.207k (± 5.6%) i/s - 3.920M in 5.006885s
with_index 694.555k (± 6.6%) i/s - 3.474M in 5.023968s
push_shift 1.674M (± 6.2%) i/s - 8.343M in 5.004380s
take_drop 3.468M (± 6.8%) i/s - 17.303M in 5.013369s