Ruby - 设置键数组中嵌套哈希的值

时间:2015-01-28 23:01:50

标签: ruby arrays hash

我从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?

3 个答案:

答案 0 :(得分:7)

您可以获取包含数组中最后一个键的哈希值(通过删除最后一个元素),然后设置键的值:

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

答案 1 :(得分:0)

你可以使用递归:

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"}}

答案 2 :(得分:0)

您可以考虑使用 set gem 中的 rodash 方法,以便将深度嵌套的值设置为哈希。

require 'rodash'

hash = { person: { age: 30, name: 'tom' } }

key = [:person, :age]
value = 40

Rodash.set(hash, key, value)

hash
# => {:person=>{:age=>40, :name=>"tom"}}