Ruby - 从键数组中设置嵌套散列的值
Ruby - Set Value of nested hash from array of keys
学习了Access nested hash element specified by an array of keys)
如果我有一个数组
array = ['person', 'age']
我有一个嵌套哈希
hash = {:person => {:age => 30, :name => 'tom'}}
我可以使用
获取年龄的值
array.inject(hash, :fetch)
但是我如何使用键数组设置 :age 的值为 40?
您可以获得包含数组中最后一个键的散列(通过删除最后一个元素),然后设置键的值:
array.map!(&:to_sym) # make sure keys are symbols
key = array.pop
array.inject(hash, :fetch)[key] = 40
hash # => {:person=>{:age=>40, :name=>"tom"}}
如果您不想修改数组,您可以使用 .last
和 [0...-1]
:
keys = array.map(&:to_sym)
key = keys.last
keys[0...-1].inject(hash, :fetch)[key] = 40
你可以使用递归:
def set_hash_value(h, array, value)
curr_key = array.first.to_sym
case array.size
when 1 then h[curr_key] = value
else set_hash_value(h[curr_key], array[1..-1], value)
end
h
end
set_hash_value(hash, array, 40)
#=> {:person=>{:age=>40, :name=>"tom"}}
您可以考虑使用 set method from the rodash gem 以便将深度嵌套的值设置为散列。
require 'rodash'
hash = { person: { age: 30, name: 'tom' } }
key = [:person, :age]
value = 40
Rodash.set(hash, key, value)
hash
# => {:person=>{:age=>40, :name=>"tom"}}
学习了Access nested hash element specified by an array of keys)
如果我有一个数组
array = ['person', 'age']
我有一个嵌套哈希
hash = {:person => {:age => 30, :name => 'tom'}}
我可以使用
获取年龄的值array.inject(hash, :fetch)
但是我如何使用键数组设置 :age 的值为 40?
您可以获得包含数组中最后一个键的散列(通过删除最后一个元素),然后设置键的值:
array.map!(&:to_sym) # make sure keys are symbols
key = array.pop
array.inject(hash, :fetch)[key] = 40
hash # => {:person=>{:age=>40, :name=>"tom"}}
如果您不想修改数组,您可以使用 .last
和 [0...-1]
:
keys = array.map(&:to_sym)
key = keys.last
keys[0...-1].inject(hash, :fetch)[key] = 40
你可以使用递归:
def set_hash_value(h, array, value)
curr_key = array.first.to_sym
case array.size
when 1 then h[curr_key] = value
else set_hash_value(h[curr_key], array[1..-1], value)
end
h
end
set_hash_value(hash, array, 40)
#=> {:person=>{:age=>40, :name=>"tom"}}
您可以考虑使用 set method from the rodash gem 以便将深度嵌套的值设置为散列。
require 'rodash'
hash = { person: { age: 30, name: 'tom' } }
key = [:person, :age]
value = 40
Rodash.set(hash, key, value)
hash
# => {:person=>{:age=>40, :name=>"tom"}}