迭代嵌套数组/散列/字符串的散列并对它们执行一些逻辑

时间:2018-02-02 17:06:52

标签: ruby-on-rails arrays ruby hash ruby-on-rails-5

我想循环遍历包含混合嵌套对象类型的哈希。 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]}]}}}

0 个答案:

没有答案