1

我正在开发一个应用程序,我想修改现有哈希的一部分,如下所示:

{a: {b: {c: 23}}}

成为:

{a: {b: {c: [23]}}}

但是,要设置的确切密钥是动态的,并且在散列中处于未知深度。有没有办法在给定键数组的哈希中设置一个值?我希望有类似的东西:

my_hash['a','b','c'] = new_value

通过递归从任意深度获取值很简单,但是由于遍历是在数据的副本而不是引用上进行的,所以我不知道在遍历期间不重建整个数组的情况下设置值的方法。

4

2 回答 2

3

除了语法(my_hash['a','b','c']),以下将做你想要的

h = {a: {b: {c: { e: 23}}, d: 34}}
keys = ['a','b','c']

def replace_nested_value_by(h, keys, value)
  if keys.size > 1
    replace_nested_value_by(h[keys.first.to_sym], keys[1..-1], value)
  elsif keys.size == 1
    h[keys.first.to_sym] = value
  end
end

puts h
replace_nested_value_by(h, keys, 42)
puts h
于 2013-04-01T13:25:03.493 回答
1

作为 toch 的答案的补充,并且超出了评论范围,我还建议这可能是一个使用的好地方inject

def nested_replace(hash, *keys, last_key, value)
  result = keys.inject(hash) { |r, k| r[k] }
  result[last_key] = value
end

h = {a: {b: {c: [23]}}}
nested_replace h, :a, :b, :c, 42
puts h
# => {:a=>{:b=>{:c=>42}}}

就个人而言,如果在查看递归之前有一种自然的方式来表达事物,我倾向于更喜欢 Ruby 的枚举器。

于 2013-04-01T14:17:16.087 回答