使用键作为数组散列 - 如何变成普通散列?

时间:2012-11-28 01:55:58

标签: ruby-on-rails ruby hash multiple-columns

我一直在使用arel / rails,并且已经找到了如何使我的组声明正常工作。使用多个列,它会提供类似的输出

{["column1_value","column2_value","column3_value"]=>count,... etc ...}

将此转换为多级哈希的最佳/最简单方法是什么?例如

{column1_value:{
  column2_value:{
   column3_value1: count,
   column3_value2: count
  }
  column2_value2:{ ...}
 }
 column2_value2: {....}
}

我明白为什么结果被数组键入,但它不是特别容易使用!。

2 个答案:

答案 0 :(得分:2)

或者,如果您更喜欢迭代方法:

a = {[:a, :b, :c]=> 1, [:a, :b, :d]=>2, [:a, :c, :e]=>3}

a.each_with_object({}) { |((*keys, l), v), m|
  keys.inject(m) {|mm, key|
    mm[key] ||= {}
  }[l] = v
}
# {:a=>{:b=>{:c=>1, :d=>2}, :c=>{:e=>3}}}

答案 1 :(得分:1)

def hashify(array, value, hash)
  key = array.shift
  if array.empty?
    hash[key] = value
  else
    hashify(array, value, hash[key] ||= {})
  end
end

a = {[:a, :b, :c]=> 1, [:a, :b, :d]=>2, [:a, :c, :e]=>3}
h = {}
a.each { |k, v| hashify(k, v, h) }

h
# => {:a=>{:b=>{:c=>1, :d=>2}, :c=>{:e=>3}}}