的阵列组红宝石哈希元素值是我得到:通过键
hash = {:a => {:b => [{:c => old_val}]}}
keys = [:a, :b, 0, :c]
new_val = 10
散列结构和设置键可以变化的。
我需要得到
hash[:a][:b][0][:c] == new_val
谢谢!
的阵列组红宝石哈希元素值是我得到:通过键
hash = {:a => {:b => [{:c => old_val}]}}
keys = [:a, :b, 0, :c]
new_val = 10
散列结构和设置键可以变化的。
我需要得到
hash[:a][:b][0][:c] == new_val
谢谢!
您可以使用inject
遍历您的嵌套结构:
hash = {:a => {:b => [{:c => "foo"}]}}
keys = [:a, :b, 0, :c]
keys.inject(hash) {|structure, key| structure[key]}
# => "foo"
所以,你只需要修改该做的最后关键一组。也许类似于
last_key = keys.pop
# => :c
nested_hash = keys.inject(hash) {|structure, key| structure[key]}
# => {:c => "foo"}
nested_hash[last_key] = "bar"
hash
# => {:a => {:b => [{:c => "bar"}]}}
与Andy的类似,但您可以使用Symbol#to_proc
来缩短它。
hash = {:a => {:b => [{:c => :old_val}]}}
keys = [:a, :b, 0, :c]
new_val = 10
keys[0...-1].inject(hash, &:fetch)[keys.last] = new_val
不错!我之前从未使用过'fetch',所以我没有想到它! –
谢谢。最后以'd = b.pop'' b.inject(a){| s,k | s [k]} [d] = 20' –