2012-02-03 5 views
1

Я прочитал довольно много сообщений, но никто, кажется, не делает этого, что немного сложно.хэш, содержащий массив массива хэшей в рубине

Скажем, у меня есть хэш, содержащий массив как одно из его значений.

hash = { 
    :a => 'one', 
    :arr => [ 
    {:id => 'ten', :amount => 10, :b => 'two'}, 
    {:id => 'twenty', :amount => 20, :b => 'two'}, 
    {:id => 'apple', :amount => 7, :b => 'applesauce'} 
    ], 
    :c => 3 
} 

Я хочу, чтобы преобразовать его в массив хэшей (который был бы размера содержащегося массива), следующим образом:

# => [ 
    {:a => 'one', :id => 'ten', :amount => 10, :b => 'two',  :c => 3}, 
    {:a => 'one', :id => 'twenty', :amount => 20, :b => 'two',  :c => 3}, 
    {:a => 'one', :id => 'apple', :amount => 7, :b => 'applesauce', :c => 3} 
] 

Преобразование должно поддерживать любой пар ключ/значение имеют внутри и за пределами массива, а в идеале я мог бы передать ключ массива, чтобы спросить его выполнить действие:

flatten_hash_array(hash, :arr) 

Я понимаю, что Руби flatten в классе Array, не то, что нам нужно. Ухватить за глагол! Любая помощь будет оценена по достоинству.

ответ

5

Это должно выполнить эту работу, не допуская проверки действительности.

def flatten_hash_array(hash, key) 
    hash[key].map {|entry| entry.merge(hash.reject {|k| k == key})} 
end 
+0

Удивительный! блок hash.reject просто должен быть передан k, v, и он работает как шарм. Благодаря! def flatten_hash_array (hash, key) hash [key] .map {| entry | entry.merge (hash.reject {| k, v | k == key})} конец – adamrneary

+0

Хм, должно быть разница 1,8/1,9 - мой Ruby принимает 'hash.reject {| k |}', хотя там доступны два параметра. Но эй, рад, что это сработает для тебя. – Chowlett

Смежные вопросы