2015-05-22 3 views
1

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

hash1 = {"key1" =>["value1","value11"], "key2" => ["value2","value21"]} 
hash2= {"key3" => ["value3","value32"], "key4" => ["value4","value42"]} 

hash1.each do |k1,v1| 
    hash2.each do |k2,v2| 
    #do something with v1 and v2 (which are arrays themselves and get ["value1","value11"] and ["value3","value32"], then ["value1","value11"] and ["value4","value42"] in the first iteration of hash 1 and ["value2","value21"]and ["value3","value32"], then ["value2","value21"]and ["value4","value42"] in the second iteration of hash1) 
    end 
end 

Это то, что я сейчас делаю. Есть ли какой-либо другой идиоматический или лучший способ

ответ

2

Я бы не подумал, что что-то не так с тем, как вы это делаете. Если вы хотите более гибкий способ, вы можете взять декартово произведение из ключевых массивов и перебрать его ...

all_key_combos = hash1.keys.product(hash2.keys) 
=> [["key1", "key3"], ["key1", "key4"], ["key2", "key3"], ["key2", "key4"]] 

all_key_combos.each do |k1,k2| 
    #do something with k1 and k2 
end 

, чтобы получить значения из этого, простая карта будет строить массив, не зная, что вы хотите, затрудняет работу, но, возможно, это укажет вам в правильном направлении?

all_key_combos.map { |k1,k2| [hash1[k1], hash2[k2]] } 
=> [[["value1", "value11"], ["value3", "value32"]], [["value1", "value11"], ["value4", "value42"]], [["value2", "value21"], ["value3", "value32"]], [["value2", "value21"], ["value4", "value42"]]] 

, если вы хотите, чтобы получить их продукт instead-

all_key_combos.map { |k1,k2| hash1[k1].product(hash2[k2]) } 
=> [[["value1", "value3"], ["value1", "value32"], ["value11", "value3"], ["value11", "value32"]], [["value1", "value4"], ["value1", "value42"], ["value11", "value4"], ["value11", "value42"]], [["value2", "value3"], ["value2", "value32"], ["value21", "value3"], ["value21", "value32"]], [["value2", "value4"], ["value2", "value42"], ["value21", "value4"], ["value21", "value42"]]] 

Возможности безграничны :)

+0

эй, спасибо. См. Редактирование в вопросе, мне нужны значения, которые являются массивами. – inquisitive

+0

получил его, спасибо. – inquisitive

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