2014-02-17 2 views
0

Привет Я не могу найти, как объединить каждые 3 хэша массива. вот мой массив хэшей.merge every 3rd Hash in Array

 [ 
     {:key1=>"v1"}, {:ky2 => "v2"}, {:key3 => "v3"}, 
     {:key1=>"v4"}, {:ky2 => "v5"}, {:key3 => "v6"}, 
     {:key1=>"v7"}, {:ky2 => "v8"}, {:key3 => "v9"},.. 
    ] 

Что мне нужно будет, чтобы объединить каждые 3 хэш выглядеть следующим образом:

 [ 
     {:key1=>"v1", :ky2 => "v2", :key3 => "v3"}, 
     {:key1=>"v4", :ky2 => "v5", :key3 => "v6"}, 
     {:key1=>"v7", :ky2 => "v8", :key3 => "v9"},.. 
     ] 

благодарственными заранее для вас помощи.

ответ

4

я сделаю

hs = [ 
     {:key1=>"v1"}, {:ky2 => "v2"}, {:key3 => "v3"}, 
     {:key1=>"v4"}, {:ky2 => "v5"}, {:key3 => "v6"}, 
     {:key1=>"v7"}, {:ky2 => "v8"}, {:key3 => "v9"} 
    ] 

hs.each_slice(3).map { |grouped_hs| grouped_hs.inject(:merge) } 
# => [{:key1=>"v1", :ky2=>"v2", :key3=>"v3"}, 
#  {:key1=>"v4", :ky2=>"v5", :key3=>"v6"}, 
#  {:key1=>"v7", :ky2=>"v8", :key3=>"v9"}] 
+1

«a» -> hs, «e» -> «grouped_hs» и &: merge ->: merge, и вы получаете мой верхний угол. Или что-то подобное, чуть более значимые имена;) – tokland

+1

@tokland Спасибо ... Done !! –

+1

tokland означает «hs» для множественных «хэшей» (массив хэшей), а не сингулярный «хэш». С 'hsh', что подразумевает хеш, оно довольно вводит в заблуждение. – sawa

0
a = [ 
    { :key1=>'v1' }, { :ky2 => 'v2' }, { :key3 => 'v3' }, 
    { :key1=>'v4' }, { :ky2 => 'v5' }, { :key3 => 'v6' }, 
    { :key1=>'v7' }, { :ky2 => 'v8' }, { :key3 => 'v9' } 
] 

a.each_slice(3).map{ |e| e.inject(&:merge) } 
1
a.flat_map(&:to_a).each_slice(3).map(&:to_h) 
    #=> [{:key1=>"v1", :ky2=>"v2", :key3=>"v3"}, 
    #=> {:key1=>"v4", :ky2=>"v5", :key3=>"v6"}, 
    #=> {:key1=>"v7", :ky2=>"v8", :key3=>"v9"}] 

Array#to_h был добавлен в v2.1.