簡體   English   中英

Ruby-將數組合並到哈希中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM