2016-11-04 178 views
1

假如我有一個數組,看起來像:獲取嵌套數組的第一個元素爲散列鍵

[ 
    [["str1"],["val1"],["val2"]], 
    [["str2"], ["val1"], ["val2"], ["val3"]] 
] 

有我得到一個哈希看起來的方式,如:

{ 
    "str1" => [["val1"],["val2"]], 
    "str2" => [["val1"],["val2"],["val3"]] 
} 

回答

3
a.map { |a| [a.first.first, a.drop(1)] }.to_h 
# or 
a.each_with_object({}) {|a, h| h[a.first.first] = a.drop(1) } 
#=> { 
#  "str1"=>[["val1"], ["val2"]], 
#  "str2"=>[["val1"], ["val2"], ["val3"]] 
# } 

如果你不希望有一個單獨的數組的每個元素:

Hash[a.map(&:flatten).map { |a| [a.first, a.drop(1)] }] 
#=> {"str1"=>["val1", "val2"], "str2"=>["val1", "val2", "val3"]} 
+1

最後一個不是將每個元素包裝在一個數組中,就像前兩個一樣。 –

+0

謝謝!我使用哈希。我一直試圖使用to_h過去兩個小時,但無濟於事。 – IronCode

+0

@AlexandreAngelim我應該說,但我不希望每個元素包裹在一個數組 – IronCode

2

如果你的數組是arr,你可以寫下面的內容。

Marshal.load(Marshal.dump(arr)).map { |a| [a.shift.first, a.map(&:first)] }.to_h 
    #=> {"str1"=>["val1", "val2"], 
    #  "str2"=>["val1", "val2", "val3"]} 

輕微變化將是:

Marshal.load(Marshal.dump(arr)).map { |a| [a.shift.first, a] }.to_h 
    #=> {"str1"=>["val1", "val2"], 
    #  "str2"=>["val1", "val2", "val3"]} 

注:我們正在使用Marshal類做的arr完全相同的副本,以避免修改原始數組。 Object#dupObject#clone在這裏不起作用。

+0

''str1「'和'」str2「'應該是關鍵字,而不是出現在我理解的值 –

+0

謝謝@Andrey。我現在不能測試。我的編輯看起來是否正確? –

+1

是的,它現在產生了預期的結果(測試):) –

0
arr = [ 
    [["str1"],["val1"],["val2"]], 
    [["str2"], ["val1"], ["val2"], ["val3"]] 
] 

arr.each_with_object({}) { |((k), *values), h| h[k]=values } 
    #=> {"str1"=>[["val1"], ["val2"]], "str2"=>[["val1"], ["val2"], ["val3"]]} 

這說明如何Ruby的用於確定塊變量的值使用平行分配的可以被有利地使用。

相關問題