Как мне переставить два хэша в ruby, чтобы создать один хеш или массив? - PullRequest
1 голос
/ 24 марта 2019

Я хочу взять два хеша ниже и объединить их в новый хеш или массив:

hash1 = {1=>"]", 2=>"}", 3=>")", 4=>"(", 5=>"{", 6=>"["}
hash2 = {1=>"[", 2=>"{", 3=>"(", 4=>")", 5=>"}", 6=>"]"}

Я хочу, чтобы результат выглядел примерно так:

result = {"["=>"]", "{"=>"}", "("=>")"}

или

result = [ ["[","]"], ["{","}"], ["(",")"] ]

Есть ли метод ruby, который может это сделать?

Ответы [ 4 ]

4 голосов
/ 24 марта 2019

Вы можете использовать Hash # transform_keys :

res = hash1.transform_keys { |k| hash2[k] }

res #=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}

res.first(3) #=> [["[", "]"], ["{", "}"], ["(", ")"]]
1 голос
/ 25 марта 2019
hash1.each_with_object({}) { |(k, v), h| h[hash2[k]] = v }

#=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}

Или:

hash2.each_with_object({}) { |(k, v), h| h[v] = hash1[k] }

#=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}
1 голос
/ 25 марта 2019

Ну, еще один способ получить то, что вы хотите, это использовать Hash # deep_merge вот так:

res = hash1.deep_merge(hash2) { |key, this_val, other_val| [other_val , this_val] }.values
# =>  [["[", "]"], ["{", "}"], ["(", ")"], [")", "("], ["}", "{"], ["]", "["]
res.first(3) 
# => [["[", "]"], ["{", "}"], ["(", ")"]]
0 голосов
/ 25 марта 2019
hash1.merge(hash2){|_, v1, v2| [v1, v2]}.values
# => [["]", "["], ["}", "{"], [")", "("], ["(", ")"], ["{", "}"], ["[", "]"]]
...