2015-05-28 72 views
0

希望這不是一個騙局,但我無法找到具體的答案。我要散列的數組:散列合併數組的輸出

a1 = [{"aws_ebs_stripe"=>"/dev/xvdi"}, {"aws_ebs_stripe"=>"/dev/xvdj"}, {"aws_ebs_stripe"=>"/dev/xvdk"}, {"aws_ebs_stripe"=>"/dev/xvdl"}] 

a2 = [{"volume_id"=>"vol-001011"}, {"volume_id"=>"vol-010110"}, {"volume_id"=>"vol-101101"}, {"volume_id"=>"vol-011001"}] 

我有一些代碼,我發現前面

Hash[a1.zip(a2.map { |i| i.include?(',') ? (i.split /, /) : i })] 

的想法是與pretty_generate這個輸出作爲JSON結合這些事,但並不完全正確在輸出第一哈希:

 { 
     "{\"aws_ebs_stripe\"=>\"/dev/xvdi\"}": { 
     "volume_id": "vol-001011" 
     } .... snip 

理想情況下,JSON應該是這樣的

"aws_ebs_stripe: /dev/xvdi": { 
     "volume_id": "vol-001011" 
    } 

我不確定清理此問題的最佳方法。

+0

爲什麼不只需要json然後在哈希上調用to_json呢? – engineersmnky

+0

你想要構造的散列是':aws'的值。正確?在'a2.map {| i | ...'中,'i'是一個散列,所以'i.include?(',')'如果'i'有一個鍵''''則爲真。那是你的意圖嗎? –

+0

作爲一個更大的散列的一部分發射 – chris

回答

0

如果您知道a1數組總是隻包含單鍵哈希值,則這是一種方法。

require 'json' 
Hash[a1.map{ |el| "#{el.keys.first}: #{el.values.first}" }.zip(a2)].to_json 

# => "{\"aws_ebs_stripe: /dev/xvdi\":{\"volume_id\":\"vol-001011 \"}, ... 

對於一個更通用的方法來內a1,像這樣處理的哈希多鍵 - 值對。

Hash[a1.map{ |el| el.map { |k,v| "#{k}: #{v}" } }.flatten.zip(a2)].to_json 

正如其他地方提到的那樣,如果可能的話,您可能想要改進您的數據結構。

+0

太棒了!通用的方法做了我所需要的。謝謝! – chris

0

它看起來像是由於某種原因你的散列aws_ebs_stripe被解釋爲一個字符串,但作爲Cary S.提到您提出的問題的散列輸出不會由您發佈的代碼生成。當我運行的輸出,您發佈的代碼和使用AP(awesome_print)我得到這樣的:

{ 
    { "aws_ebs_stripe" => "/dev/xvdi" } => { 
     "volume_id" => "vol-001011" 
    }, 
    { "aws_ebs_stripe" => "/dev/xvdj" } => { 
     "volume_id" => "vol-010110" 
    }, 
    { "aws_ebs_stripe" => "/dev/xvdk" } => { 
     "volume_id" => "vol-101101" 
    }, 
    { "aws_ebs_stripe" => "/dev/xvdl" } => { 
     "volume_id" => "vol-011001" 
    } 
} 

但仍是JSON將始終立足於正在創建的方式進行轉義。看看會發生什麼,當你撥打你所創建的哈希.keys:

 :051 > ap h.keys 
[ 
    [0] { 
     "aws_ebs_stripe" => "/dev/xvdi" 
    }, 
    [1] { 
     "aws_ebs_stripe" => "/dev/xvdj" 
    }, 
    [2] { 
     "aws_ebs_stripe" => "/dev/xvdk" 
    }, 
    [3] { 
     "aws_ebs_stripe" => "/dev/xvdl" 
    } 
] 

和h.values:

:052 > ap h.values 
[ 
    [0] { 
     "volume_id" => "vol-001011" 
    }, 
    [1] { 
     "volume_id" => "vol-010110" 
    }, 
    [2] { 
     "volume_id" => "vol-101101" 
    }, 
    [3] { 
     "volume_id" => "vol-011001" 
    } 
] 

好像你需要得到的數據結構右所以它會轉換以更有用的方式提供給json。

+0

我認爲這是我不清楚的地方,這是合併這些數組的最佳方式。 – chris