我有 3 個具有多個哈希的陣列,我試圖將它們轉換為鍵/值匹配的單個哈希陣列
a = [{"name"=>"aaa", "a"=>"1", "b"=>"2"}, {"name"=>"bbb", "a"=>"1", "b"=>"2"}]
b = [{"name"=>"aaa", "c"=>"1", "d"=>"2"}, {"name"=>"bbb", "c"=>"1", "d"=>"2"}]
c = [{"name"=>"aaa", "e"=>"1", "f"=>"2"}, {"name"=>"bbb", "e"=>"1", "f"=>"2"}]
要得到
combined = [{"name"=>"aaa", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"}, {"name"=>"bbb", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"}]
uj5u.com熱心網友回復:
我認為這就是你所需要的。
hashes = [a, b, c]
result = hashes.inject([]) do |result, hash_array|
hash_array.each do |hash|
index = result.find_index{|item| item["name"] == hash["name"]}
if index
result[index] = result[index].merge(hash)
else
result << hash
end
end
result
end
uj5u.com熱心網友回復:
這看起來更酷,并且仍然可以解決您的問題:
a.zip(b,c).map{|vertical_array| e.inject({}) {|result, k| result.merge(k)} }
安慰:
2.5.1 :016 > a.zip(b,c).map{|e|e.inject({}){|result, k| result.merge(k)} }
=> [{"name"=>"aaa", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"}, {"name"=>"bbb", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"}]
uj5u.com熱心網友回復:
[a,b,c].transpose
.map { |arr| arr.reduce(&:merge) }
#=> [{"name"=>"aaa", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"},
{"name"=>"bbb", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"}]
a如果,b和的元素的順序c不能保證,可以寫
[a,b,c].map { |arr| arr.sort_by { |h| h["name"] } }
.transpose
.map { |arr| arr.reduce(&:merge) }
要么
(a b c).each_with_object({}) do |g,h|
h.update(g["name"]=>g) { |_,o,n| o.merge(n) }
end.values
后者使用Hash#update (aka merge!) 的形式,該形式使用塊 ( { |_,o,n| o.merge(n) }) 來確定合并的兩個哈希中存在的鍵的值。請注意,這里Hash#values的接收者是
(a b c).each_with_object({}) do |g,h|
h.update(g["name"]=>g) { |_,o,n| o.merge(n) }
end
#=> {"aaa"=>{"name"=>"aaa", "a"=>"1", "b"=>"2", "c"=>"1",
# "d"=>"2", "e"=>"1", "f"=>"2"},
# "bbb"=>{"name"=>"bbb", "a"=>"1", "b"=>"2", "c"=>"1",
# "d"=>"2", "e"=>"1", "f"=>"2"}]
這種計算還允許資料內容的更多變化。假設,例如:
a = [{"name"=>"aaa", "a"=>"1", "b"=>"2"}, {"name"=>"bbb", "a"=>"1", "b"=>"2"}]
b = [{"name"=>"bbb", "c"=>"1", "d"=>"2"}, {"name"=>"ccc", "c"=>"1", "d"=>"2"}]
c = [{"name"=>"ccc", "e"=>"1", "f"=>"2"}, {"name"=>"aaa", "e"=>"1", "f"=>"2"}]
然后
(a b c).each_with_object({}) do |g,h|
h.update(g["name"]=>g) { |_,o,n| o.merge(n) }
end
#=> {"aaa"=>{"name"=>"aaa", "a"=>"1", "b"=>"2", "e"=>"1", "f"=>"2"},
# "bbb"=>{"name"=>"bbb", "a"=>"1", "b"=>"2", "c"=>"1", "d"=>"2"},
# "ccc"=>{"name"=>"bbb", "c"=>"1", "d"=>"2", "e"=>"1", "f"=>"2"}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/455222.html
標籤:红宝石
上一篇:(Hackerrank)Ruby-Enumerable-group_byif條件問題
下一篇:將毫秒時間戳舍入到最接近的30秒
