2016-11-14 30 views
0

我有一个未知长度的字符串数组(但我们可以说最多5个)。我也有一个空的散列h = {}和一个值。如何在动态嵌套散列中插入值?

我要变换的阵列和值哈希是这样的:

val = 1 
h = {} 
a = ['a', 'b', 'c', 'd'] 
# result I want: 
{ 
    'a' => { 
    'b' => { 
     'c' => { 
     'd' => 1 
     } 
    } 
    } 
} 

最重要的是,一些关键的可能已经存在(在循环重复,创建之前)。所以我可能有:

val = 2 
h = {'a' => {'b' => {'c' => {'d' => 1}}}} 
a = ['a', 'b', 'c', 'e'] 
# result I want: 
{ 
    'a' => { 
    'b' => { 
     'c' => { 
     'd' => 1, 
     'e' => 2 
     } 
    } 
    } 
} 

任何想法如何做到这一点?

回答

3

再次,inject救援:

def dredge(hash, list, value = nil) 
    # Snip off the last element 
    *list, tail = list 

    # Iterate through the elements in the path... 
    final = list.inject(hash) do |h, k| 
    # ...and populate with a hash if necessary. 
    h[k] ||= { } 
    end 

    # Add on the final value 
    final[tail] = value 

    hash 
end 

这可能取决于你如何弹性需要它的东西像零长度列表等来提高一点。

这是适用于:

h = {} 
a = ['a', 'b', 'c', 'd'] 
dredge(h, a, 1) 
# => {"a"=>{"b"=>{"c"=>{"d"=>1}}}} 

h = {'a' => {'b' => {'c' => {'d' => 1}}}} 
a = ['a', 'b', 'c', 'e'] 

dredge(h, a, 2) 
# => {"a"=>{"b"=>{"c"=>{"d"=>1, "e"=>2}}}} 
+3

我正要张贴相同:-)你可以使用'*名单,尾= list'避免变异'list' – Stefan

+0

诚然,这可能是一个更好的主意。让我改变这一点。 – tadman