【发布时间】:2015-07-23 14:05:41
【问题描述】:
所以我有一个嵌套数组,我想将它转换成一个散列,这样一个公共键指向一个值数组。这是我所拥有的:
b=[[6, "Jet"], [0, "Fuel"], [0, "Engine"]]
c={}
b.map { |x| c[x[0]] ||= []; c[x[0]] << x[1] }
=> {6=>["Jet"], 0=>["Fuel", "Engine"]}
有没有更惯用的方法来做到这一点?
【问题讨论】:
所以我有一个嵌套数组,我想将它转换成一个散列,这样一个公共键指向一个值数组。这是我所拥有的:
b=[[6, "Jet"], [0, "Fuel"], [0, "Engine"]]
c={}
b.map { |x| c[x[0]] ||= []; c[x[0]] << x[1] }
=> {6=>["Jet"], 0=>["Fuel", "Engine"]}
有没有更惯用的方法来做到这一点?
【问题讨论】:
地图可以修改如下。差别不大,但没有;。
b.map { |x| (c[x[0]] ||= []) << x[1] }
注意:each 更适合这里。
【讨论】:
b.map { |k, v| (c[k] ||= []) << v }.
我不知道这是否更惯用,但我发现使用the Hash constructor that takes a block 更具可读性:
c = Hash.new { |h, k| h[k] = [] }
b.each { |k, v| c[k] << v }
结果存储在c(test)中。
【讨论】: