2017-06-27 217 views
0

我有一個哈希看起來像操縱散列紅寶石

{ 
"lt"=>"456", 
"c"=>"123", 
"system"=>{"pl"=>"valid-player-name", "plv"=>"player_version_1"}, 
"usage"=>{"trace"=>"1", "cq"=>"versionid", "stream"=>"od", 
"uid"=>"9", "pst"=>[["0", "1", "10"]], "dur"=>"0", "vt"=>"2"} 
} 

我怎麼能去把它變成一個哈希看起來像

{ 
"lt"=>"456", 
"c"=>"123", 
"pl"=>"valid-player-name", 
"plv"=>"player_version_1", 
"trace"=>"1", 
"cq"=>"versionid", 
"stream"=>"od", 
"uid"=>"9", 
"pst"=>[["0", "1", "10"]], "dur"=>"0", "vt"=>"2" 
} 

我基本上是想擺脫按鍵system的和usage並保持嵌套在他們

什麼任何幫助表示讚賞

感謝

+0

就提,有一個'}'附加在你的預期輸出中。 –

+0

哎呀,感謝:-) – Richlewis

回答

2

「低技術」的版本:)

h = { ... } 
h.merge!(h.delete('system')) 
h.merge!(h.delete('usage')) 
+0

謝謝塞爾吉奧,總是喜歡低技術版本:-),我認爲刪除將刪除整個嵌套的散列,應該已經嘗試過:-( – Richlewis

+0

@Richlewis:閱讀文檔是好的:) –

+1

我知道,讓我自己失望一點,謝謝你的幫助 – Richlewis

0

如果您計劃鍵合併的任意大名單,這是一個很容易可擴展的方法:

["system", "usage"].each_with_object(myhash) do |key| 
    myhash.merge!(myhash.delete(key)) 
end 
1

假設沒有扶手:

hash.reject { |key, _| %w(system usage).include? key }.merge(hash['system']).merge(hash['usage']) 

隨着積極支持:

hash.except('system', 'usage').merge(hash['system']).merge(hash['usage']) 
1

假設你的數據有每一次相同的結構,我可能會選擇一些簡單和易於理解是這樣的:

def manipulate_hash(h) 
    { 
    "lt" => h["lt"], 
    "c" => h["c"], 
    "pl" => h["system"]["pl"], 
    "plv" => h["system"]["plv"], 
    "trace" => h["usage"]["trace"], 
    "cq" => h["usage"]["cq"], 
    "stream" => h["usage"]["stream"], 
    "uid" => h["uid"], 
    "pst" => h["pst"], 
    "dur" => h["dur"], 
    "vt" => h["vt"] 
    } 
end 

我選擇使用跨越多行的一個大散列字面表達式來製作散列。如果你不喜歡,你可以建立起來的多條線路是這樣的:

def manipulate_hash 
    r = {} 
    r["lt"] = h["lt"] 
    r["c"] = h["c"] 
    ... 
    r 
end 

您可以考慮使用取代替[]尖括號。這樣,如果預期的密鑰從散列中丟失,你將會得到一個異常。例如,將h["lt"]替換爲h.fetch("lt")

1

更通用的版本。

合併包含一個哈希任意鍵:

h = { ... } 

hnew = h.inject(h.dup) { |h2, (k, v)| 
    h2.merge!(h2.delete(k)) if v.is_a?(Hash) 
    h2 
}