我正在开发一个应用程序,我想修改现有哈希的一部分,如下所示:
{a: {b: {c: 23}}}
成为:
{a: {b: {c: [23]}}}
但是,要设置的确切密钥是动态的,并且在散列中处于未知深度。有没有办法在给定键数组的哈希中设置一个值?我希望有类似的东西:
my_hash['a','b','c'] = new_value
通过递归从任意深度获取值很简单,但是由于遍历是在数据的副本而不是引用上进行的,所以我不知道在遍历期间不重建整个数组的情况下设置值的方法。
我正在开发一个应用程序,我想修改现有哈希的一部分,如下所示:
{a: {b: {c: 23}}}
成为:
{a: {b: {c: [23]}}}
但是,要设置的确切密钥是动态的,并且在散列中处于未知深度。有没有办法在给定键数组的哈希中设置一个值?我希望有类似的东西:
my_hash['a','b','c'] = new_value
通过递归从任意深度获取值很简单,但是由于遍历是在数据的副本而不是引用上进行的,所以我不知道在遍历期间不重建整个数组的情况下设置值的方法。
除了语法(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
作为 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 的枚举器。