我想循环遍历包含混合嵌套对象类型的哈希。 E.g。
{
"a" => "1",
"b" => ["1", "2"],
"c" => {"d" => "1", "e" => {"f" => ["1", "2", {"g" => ["x", "y", "1"]}]}}
}
并将所有字符串值转换为整数,因为它们仅由数字组成。所以他们应该匹配/^\d+$/
。
但重要的部分是迭代部分。
如何找到键/值对的所有值以及数组中的所有值,以便我可以操作它们?
它有点类似于deep_symbolize_keys方法,只有在这里我对散列键的所有其他内容感兴趣。
我自己的实现是这样的,但它很长,我可能没有抓住所有边缘情况:
def all_to_i(x)
if x.is_a?(Hash)
x.each do |k, v|
if v.is_a?(Hash)
all_to_i(v)
elsif v.is_a?(Array)
x[k] = v.map { |v2| all_to_i(v2) }
elsif v.is_a?(String)
if v.scan(/^\d+$/) != []
x[k] = v.to_i
else
x[k] = v
end
end
end
elsif x.is_a?(Array)
x.map { |x2| all_to_i(x2) }
elsif x.is_a?(String)
if x.scan(/^\d+$/) != []
x.to_i
else
x
end
end
end
# => {"a"=>1, "b"=>[1, 2], "c"=>{"d"=>1, "e"=>{"f"=>[1, 2, {"g"=>["x", "y", 1]}]}}}