我正在开发一个应用程序,我想修改现有哈希的一部分,如下所示:
{a: {b: {c: 23}}}
是:
{a: {b: {c: [23]}}}
但是,要设置的确切键是动态的,并且在散列中处于未知深度。有没有办法在给定一组键的哈希值中设置一个值?我希望有类似的东西:
my_hash['a','b','c'] = new_value
通过递归获取任意深度的值很简单,但由于遍历适用于数据的副本而不是引用,因此我不知道如何在遍历期间重建整个数组而不设置值。 / p>
答案 0 :(得分: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
答案 1 :(得分: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的普查员。