我有一个数组,例如。 arr = [:a, :b, :c]
我希望以
[{:a => [{:b => [:c] } ] } ]
答案 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