在Ruby中将表转换为多维哈希

时间:2014-03-08 17:21:12

标签: ruby hash

我知道必须有一些简单而优雅的方法来做到这一点,但我正在画一个空白。

我有一个表(或一组键值对)

id,val
64664,68
64665,65
64666,53
64667,68
64668,6
64668,27
64668,33
64669,12

在大多数情况下,每个ID都有一个值。在某些情况下,有倍数。 我想最终得到每个id,其中多个值表示为这些值的数组

类似的东西:

[ 64664 => 68,
64665 => 65, 
64666 => 53, 
64668 =>[6,27,33],
64669 => 12
]

有什么好主意吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Hash#merge合并两个哈希值。使用Enumerable#inject,您可以获得所需内容。

tbl = [
  [64664, 68],
  [64665, 65],
  [64666, 53],
  [64667, 68],
  [64668, 6],
  [64668, 27],
  [64668, 33],
  [64669, 12],
]

# Convert the table to array of hashes
hashes = tbl.map { |id, val|
  {id => val}
}

# Merge the hashes
hashes.inject { |h1, h2|
  h1.merge(h2) { |key,old,new|
    (old.is_a?(Array) ? old : [old]) << new
  }
}
# => {64664=>68, 64665=>65, 64666=>53, 64667=>68, 64668=>[6, 27, 33], 64669=>12}

答案 1 :(得分:0)

values = [
  [64664, 68],
  [64665, 65],
  [64666, 53],
  [64667, 68],
  [64668, 6],
  [64668, 27],
  [64668, 33],
  [64669, 12],
]

# When key not present, create new empty array as default value
h = Hash.new{|h,k,v| h[k]=[]} 
values.each{|(k,v)| h[k] << v}

p h #=>{64664=>[68], 64665=>[65], 64666=>[53], 64667=>[68], 64668=>[6, 27, 33], 64669=>[12]}