[英]Ruby - Merge an Array into a Hash
我有一個看起來像這樣的數組:
array = [[:foo, :bar], [:foo, :baz], [:baz, {a: 1, b: 2}], [:baz, {c: 1, d:2}]]
我需要將其轉換為如下所示的哈希:
{:foo =>[:bar, :baz], :baz => {a: 1, b: 2, c: 1, d: 2}}
這是我到目前為止的代碼:
def flatten(array)
h = {}
array.each_with_object({}) do |(k, v), memo|
if v.is_a?(Hash)
memo[k] = h.merge!(v)
else
# What goes here?
end
end
end
像這樣使用時:
flatten(array)
輸出:
{baz => {:a => 1, :b => 2, :c => 1, :d => 2}}
有人可以指出正確的方向嗎? 幫助表示贊賞。
def convert(arr)
arr.each_with_object({}) do |a,h|
h[a.first] =
case a.last
when Hash
(h[a.first] || {}).update(a.last)
else
(h[a.first] || []) << a.last
end
end
end
convert array
#=> {:foo=>[:bar, :baz], :baz=>{:a=>1, :b=>2, :c=>1, :d=>2}}
Hash[ array.group_by(&:first).map{ |k,a| [k,a.map(&:last)] } ]
這是我解決這個問題的嘗試。 我必須假設在輸入數組中,類似於:baz
這樣的條目將始終與Hash
對象配對。 如果您有一個:baz
和一個符號,另一個帶有哈希,則該解決方案將不起作用。
array = [[:foo, :bar], [:foo, :baz], [:baz, {a: 1, b: 2}], [:baz, {c: 1, d:2}]]
h = Hash.new
array.each do |n1, n2|
if n2.class == Hash
h[n1] = (h[n1] || {}).merge(n2)
else
h[n1] = (h[n1] || []) << n2
end
end
p h
產量
{:foo=>[:bar, :baz], :baz=>{:a=>1, :b=>2, :c=>1, :d=>2}}
[Finished in 0.1s]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.