假如我有一個數組,看起來像:獲取嵌套數組的第一個元素爲散列鍵
[
[["str1"],["val1"],["val2"]],
[["str2"], ["val1"], ["val2"], ["val3"]]
]
有我得到一個哈希看起來的方式,如:
{
"str1" => [["val1"],["val2"]],
"str2" => [["val1"],["val2"],["val3"]]
}
假如我有一個數組,看起來像:獲取嵌套數組的第一個元素爲散列鍵
[
[["str1"],["val1"],["val2"]],
[["str2"], ["val1"], ["val2"], ["val3"]]
]
有我得到一個哈希看起來的方式,如:
{
"str1" => [["val1"],["val2"]],
"str2" => [["val1"],["val2"],["val3"]]
}
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"]}
如果你的數組是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#dup或Object#clone在這裏不起作用。
''str1「'和'」str2「'應該是關鍵字,而不是出現在我理解的值 –
謝謝@Andrey。我現在不能測試。我的編輯看起來是否正確? –
是的,它現在產生了預期的結果(測試):) –
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的用於確定塊變量的值使用平行分配的可以被有利地使用。
最後一個不是將每個元素包裝在一個數組中,就像前兩個一樣。 –
謝謝!我使用哈希。我一直試圖使用to_h過去兩個小時,但無濟於事。 – IronCode
@AlexandreAngelim我應該說,但我不希望每個元素包裹在一個數組 – IronCode