我有以下数组
a=[["kvm16", "one-415"], ["kvm16", "one-416"], ["kvm5", "one-417"]]
我想将此转换为看起来像这样的哈希
{"kvm5"=>["one-417"], "kvm16"=>["one-417", "one-416"]}
我试过的一切都压低了价值。
v=Hash[ a.collect do |p| [p[0], [ p[1] ] ] end ]
=> {"kvm5"=>["one-417"], "kvm16"=>["one-416"] }
我原以为我可以查看v [p [0]]是否是一个数组,但是该块中没有定义变量。
有没有一种干净的方法来完成我想要的东西?
答案 0 :(得分: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"]}
或者,如果您使用的是旧款红宝石(1.8.x):
h = {}
a.each do |k, v|
(h[k] ||= []) << v
end
h # => {"kvm16"=>["one-415", "one-416"], "kvm5"=>["one-417"]}
答案 1 :(得分:4)
让我们看看一些功能性方法。这是一个常见的抽象,你可以在Facets中找到Enumerable#map_by:
require 'facets'
hs.map_by { |k, v| [k, v] }
#=> {"kvm16"=>["one-415", "one-416"], "kvm5"=>["one-417"]}
此模式取代了繁琐的group_by
+ map
+ Hash
:
Hash[hs.group_by(&:first).map { |k, gs| [k, gs.map(&:last)] }]
#=> {"kvm16"=>["one-415", "one-416"], "kvm5"=>["one-417"]}
答案 2 :(得分:0)
这有它。面对我的ruby和一些googleze中没有each_with_object,我到了
{}.tap{ |h| items.each{ |item| h[item.id] = item } }
=> {"kvm5"=>["one-417"], "kvm16"=>["one-415", "one-416"]}
感谢Sergio让我沿着那条线思考