2016-11-14 17 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

私はあなたが真 – Stefan

+0

list' '変異避けるために= list'' *リスト、テールを使用することができます:-)同じを投稿しようとしていた、それはおそらくより良いアイデアです。私はそれを変更させてください。 – tadman

関連する問題