【发布时间】:2018-04-26 09:52:45
【问题描述】:
我正在尝试做一个扁平化的变体,例如:
{a: {b: 1}}
我应该得到这个
#=> {"a.b":1}
等等
这是我的代码:
require 'active_support'
require 'active_support/core_ext'
def pathifize(hash,results = {}, current_key='', b = ".")
hash.each do |new_key, value|
combined_key = [current_key,new_key].delete_if { |k| k.blank? }.join(b)
if value.is_a?(Hash)
pathifize(hash,results, combined_key, b)
else
results[combined_key] = value
end
end
end
在 Irb 上进行测试时,我的堆栈级别太深了。
【问题讨论】:
-
这很正常,您的递归外检查是
value.is_a?(Hash),但pathifize是在hash上调用的 -
旁注: github.com/am-kantox/iteraptor 是(除了许多其他事情之外)您想要的宝石。你可以看看它的灵感代码。
-
@mdesantis 谢谢,嗯,我还是得到了 => {:a=>{:b=>1}} 你知道如何让它像 => {"a.b" :1}
-
@Arb 是的,我知道,我试过了,但这是另一个问题,恕我直言,你应该先尝试自己修复它:) 这是一个很好的练习
标签: ruby-on-rails ruby yaml