{ :world => "Hello World",-6ren">
gpt4 book ai didi

ruby-on-rails - 使用 Ruby/Rails 将嵌套散列展平为单个散列

转载 作者:数据小太阳 更新时间:2023-10-29 06:33:48 30 4
gpt4 key购买 nike

我想“展平”(不是传统意义上的 .flatten)不同深度的散列,如下所示:

{
:foo => "bar",
:hello => {
:world => "Hello World",
:bro => "What's up dude?",
},
:a => {
:b => {
:c => "d"
}
}
}

向下分解为一层哈希,所有嵌套键合并为一个字符串,所以它会变成这样:

{
:foo => "bar",
:"hello.world" => "Hello World",
:"hello.bro" => "What's up dude?",
:"a.b.c" => "d"
}

但我想不出一个好的方法来做到这一点。它有点像 Rails 添加到 Hashes 的 deep_ 辅助函数,但又不完全相同。我知道递归是解决问题的方法,但我从来没有用 Ruby 编写过递归函数。

最佳答案

你可以这样做:

def flatten_hash(hash)
hash.each_with_object({}) do |(k, v), h|
if v.is_a? Hash
flatten_hash(v).map do |h_k, h_v|
h["#{k}.#{h_k}".to_sym] = h_v
end
else
h[k] = v
end
end
end

flatten_hash(:foo => "bar",
:hello => {
:world => "Hello World",
:bro => "What's up dude?",
},
:a => {
:b => {
:c => "d"
}
})
# => {:foo=>"bar",
# => :"hello.world"=>"Hello World",
# => :"hello.bro"=>"What's up dude?",
# => :"a.b.c"=>"d"}

关于ruby-on-rails - 使用 Ruby/Rails 将嵌套散列展平为单个散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23521230/

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