作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在寻找一种简洁的方法来将值设置为给定键访问器列表的哈希深度。
path = [:mountain, :river, :tree]
hash = {}
deep_nest(hash, path, 23)
=> { mountain: { river: { tree: 23 } } }
我用下面的代码让它工作
deep = path.inject(hash) do |hash, field|
if hash.key?(field)
hash[field]
else
hash[field] = {}
end
end
deep[path.last] = 23
有没有更短的路?通常默认的初始化在散列上很好地工作,但这只适用于第一级,也许这可以更动态地完成。
最佳答案
我不确定这是否符合简洁的定义,但是解决这个问题的一种方法是将值构造为哈希的完整路径,并将其与原始哈希进行深度合并,从而使原始哈希成为非空。
path = [:mountain, :river, :tree]
hash = {:mountain=>{:river=>{:tree=>66}, :house=>:red}}
hash.merge!((path + [23]).reverse.reduce { |s,e| { e => s } }) { |k,o,n| o.merge(n) }
# => {:mountain=>{:river=>{:tree=>23}, :house=>:red}}
注意我使用 path + [23]
而不是 path << 23
避免修改 path
, 和 merge!
而不是 merge
修改hash
.
阶段说明(向外工作):
(path + [23]).reverse.reduce { |s,e| { e => s } }
:创建具有值的路径哈希hash.merge!( ... ) { |k,o,n| o.merge(n) }
:使用合并策略深度合并散列 new-value-merges-onto-old-value(这个问题与 https://www.ruby-forum.com/topic/4417754 非常相似,尽管不完全相同。)
关于ruby - 给定路径数组,将值深度嵌套到散列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19304135/
我是一名优秀的程序员,十分优秀!