从Ruby中的元素数组中创建深度哈希

时间:2016-09-08 17:33:55

标签: ruby

我有一个数组,例如。 arr = [:a, :b, :c]我希望以

的形式从中获取哈希值
[{:a => [{:b => [:c] } ] } ]

3 个答案:

答案 0 :(得分:3)

又快又脏:

[{ arr.shift => [{ arr.shift => [arr.shift] }] }]

对Cary来说,这有点不那么脏了:

[{ arr[0] => [{ arr[1] => [arr[2]] }] }]

或者:

enum = arr.each
[{ enum.next => [{ enum.next => [enum.next] }] }]

如果你正在寻找一些更灵活的东西,这里有一个递归方法:

def nest(arr)
  head, *tail = arr
  return [head] if tail.empty?
  [{ head => nest(tail) }]
end

nest([:a, :b, :c]) # => [{:a=>[{:b=>[:c]}]}]

答案 1 :(得分:1)

您可以使用inject

来结束某些事情
arr.reverse.inject([]) { |memo, item| [{item => memo }] }
# => [{:a=>[{:b=>[{:c=>[]}]}]}]

并感谢卡里的评论,现场:

arr.reverse.inject([]) { |memo, item| memo.empty? ? [item] : [{item => memo }] }
# => [{:a=>[{:b=>[:c]}]}]

答案 2 :(得分:1)

如果你毫不犹豫地改变输入:

loop.inject([]) do |memo|
  break memo unless e = arr.pop
  [memo.empty? ? e : {e => memo}]
end

要不改变初始数组arr,请事先调用dup,或使用迭代器:

iter = arr.reverse.each
loop.inject([]) do |memo|
  break memo unless e = iter.next
  [memo.empty? ? e : {e => memo}]
end