Как разбить Ruby Array of Hashes - PullRequest
0 голосов
/ 15 мая 2018

Я хочу разбить массив хэшей.

.split не работает на нем.

enter image description here

Я хочуразделить его на две части, сохраняя порядок, поэтому .partion, .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"}
  ]
]

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Этого можно добиться, используя drop и take :

def split_by_index(array, n)
  [array.take(n), array.drop(n)]
end
0 голосов
/ 15 мая 2018

Вы можете использовать [] обозначение с диапазонами.

arr = [*1..6]
s = arr.size
[arr[0..s/2-1], arr[s/2..-1]]
 #=> [[1, 2, 3], [4, 5, 6]]

arr = [*1..7]
s = arr.size
[arr[0..s/2-1], arr[s/2..-1]]
 #=> [[1, 2, 3], [4, 5, 6, 7]]
0 голосов
/ 15 мая 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...