来自数组的数组的Ruby哈希

J.T*_*.T. 2 ruby arrays hash

我有以下数组

a=[["kvm16", "one-415"], ["kvm16", "one-416"], ["kvm5", "one-417"]]
Run Code Online (Sandbox Code Playgroud)

我想将此转换为看起来像这样的哈希

{"kvm5"=>["one-417"], "kvm16"=>["one-417", "one-416"]}
Run Code Online (Sandbox Code Playgroud)

我试过的一切都压扁了价值.

v=Hash[ a.collect do |p| [p[0], [ p[1] ] ] end ]
=> {"kvm5"=>["one-417"], "kvm16"=>["one-416"] }
Run Code Online (Sandbox Code Playgroud)

我以为我可以检查v [p [0]]是否是一个数组,但是该块中没有定义变量.

有没有一个干净的方法来完成我正在寻找的东西?

Ser*_*sev 5

是的,你必须自己做,我很害怕.

a = [["kvm16", "one-415"], ["kvm16", "one-416"], ["kvm5", "one-417"]]

h = a.each_with_object({}) do |(k, v), memo|
  (memo[k] ||= []) << v
end

h # => {"kvm16"=>["one-415", "one-416"], "kvm5"=>["one-417"]}
Run Code Online (Sandbox Code Playgroud)

或者,如果你使用旧版的红宝石(1.8.x):

h = {}
a.each do |k, v|
  (h[k] ||= []) << v
end

h # => {"kvm16"=>["one-415", "one-416"], "kvm5"=>["one-417"]}
Run Code Online (Sandbox Code Playgroud)