簡體   English   中英

來自數組的數組的Ruby哈希

[英]Ruby hash of arrays from array

我有以下數組

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]]是否是一個數組,但是該塊中沒有定義變量。

有沒有一種干凈的方法來完成我正在尋找的東西?

是的,你必須自己做,我很害怕。

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"]}

讓我們看看一些功能方法。 這是一個常見的抽象,你可以在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"]}

這有它。 面對在我的ruby版本中沒有each_with_object和一些googleze,我到了

{}.tap{ |h| items.each{ |item| h[item.id] = item } }
=> {"kvm5"=>["one-417"], "kvm16"=>["one-415", "one-416"]}

感謝塞爾吉奧讓我思考這條線

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM