2014-01-19 30 views
1

我已經搜遍了有關使用deep_merge的所有答案;然而,我仍然遇到了我的特殊問題。我試圖合併2個哈希值併爲每個匹配添加一個特定的鍵。例如:散列深數組與數組

更新FORMAT

哈希1:

{ 
    "actions"=> [ 
    { 
     "causes"=> [ 
     { 
      "shortDescription"=>"short description for run 1", 
      "userId"=>"user.a" 
     } 
     ] 
    } 
    ], 
    "artifacts"=> [], 
    "fullDisplayName"=>"Run #1", 
    "result"=>"FAILURE", 
    "changeSet"=> { 
    "items"=>[], 
    "kind"=>nil 
    }, 
    "culprits"=> [] 
} 

哈希2:

{ 
    "actions"=> [ 
    { 
     "causes"=> [ 
     { 
      "shortDescription"=>"short description for run 2", 
      "userId"=>"user.b" 
     } 
     ] 
    } 
    ], 
    "artifacts"=> [], 
    "fullDisplayName"=>"Run #2", 
    "result"=>"FAILURE", 
    "changeSet"=> { 
    "items"=>[], 
    "kind"=>nil 
    }, 
    "culprits"=> [] 
} 

密鑰列表:

["key-one","key-two"] 

我想結果散列是:

{ 
    "actions"=> [ 
    { 
     "causes"=> [ 
     { 
      "shortDescription"=> { 
      "key-one" => "short description for run 1", 
      "key-two" => "short description for run 2" 
      }, 
      "userId"=> { 
      "key-one" => "user.a", 
      "key-two" => "user.b" 
      } 
     } 
     ] 
    } 
    ], 
    "artifacts"=> { 
    "key-one" => [], 
    "key-two" => [] 
    }, 
    "fullDisplayName"=> { 
    "key-one" => "Run #1", 
    "key-two" => "Run #2" 
    }, 
    "result"=> { 
    "key-one" => "FAILURE", 
    "key-two" => "FAILURE" 
    }, 
    "changeSet"=> { 
    "items"=> { 
     "key-one" => [], "key-two" => [] 
    }, 
    "kind"=> { 
     "key-one" => nil, 
     "key-two" => nil 
    } 
    }, 
    "culprits"=> { 
    "key-one" => [], 
    "key-two" => [] 
    } 
} 
+0

我想你應該抓住你的哈希的'max_depth'(如這裏所示'https://stackoverflow.com/questions/18500070/any-good-way-of-returning-the-max-depth- )然後在那裏注入密鑰列表值,最後合併數組 – Newben

+0

@CarySwoveland - 已更新!謝謝 – dimtruck

+0

@Newben - 今晚我會嘗試這種方法。謝謝! – dimtruck

回答

0

如果h1h2即是要合併這兩個散列和h3是期望的結果,我認爲下面應該工作:

@merge_key1, @merge_key2 = "key-one", "key-two" 

def merge_em(g1, g2) 
    case g1 
    when Array 
    g1.size.times {|i| merge_em(g1[i], g2[i])} 
    when Hash 
    g1.keys.each do |k| 
     v = g1[k] 
     if (Hash === v || (Array === v && !v.empty?)) 
     merge_em(v, g2[k]) 
     else 
     g1[k] = {@merge_key1 => v, @merge_key2 => g2[k]} 
     end 
    end 
    end 
end 

h = Marshal.load(Marshal.dump(h1)) 
merge_em(h, h2) 
p (h == h3) # => true 

幾點說明:

  • 該解決方案依賴於散列結構;如果結構發生變化,它可能不起作用。
  • Marshal.load(Marshal.dump(h1))用於製作h1的「深度複製」,以便h1未被修改。如果h1可以修改,merge_em(h1, h2)就足夠了,h1是合併的散列。
  • 寶石awesome_print爲您提供這些複雜結構的格式良好的顯示。你需要在這裏做的是require 'ap',然後是ap h。嘗試一下!
+0

謝謝!精美地工作! – dimtruck