gpt4 book ai didi

ruby - 给定路径数组,将值深度嵌套到散列中

转载 作者:数据小太阳 更新时间:2023-10-29 08:38:34 24 4
gpt4 key购买 nike

我正在寻找一种简洁的方法来将值设置为给定键访问器列表的哈希深度。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com