LoginSignup
7
6

More than 5 years have passed since last update.

[Ruby] 途中にArrayが入っても辿れるdeep_symbolize_keys

Posted at

Railsの実装だと、ハッシュ構造の途中に配列が挟まった場合に、それ以下の階層が処理されないことに気づく。

{'a'=>[{'b'=>100}, {'c'=>999}]}.deep_symbolize_keys
#=> {:a=>[{"b"=>100}, {"c"=>999}]}

これも辿れるものを。

class Hash
  def deep_symbolize_keys
    self.each_with_object({}) do |(key, val), memo|
      if val.is_a?(Array)
        val = val.map{|v| v.deep_symbolize_keys}
      elsif val.is_a?(Hash)
        val = val.deep_symbolize_keys
      end
      memo[key.to_s.to_sym] = val
    end
  end
end
{'a'=>[{'b'=>100}, {'c'=>999}]}.deep_symbolize_keys
#=> {:a=>[{:b=>100}, {:c=>999}]}

今回はRailsの外でオレオレ実装したい場合だったので、これで。Rails上でやりたい場合は大胆に deep_transform_keys から上書きしちゃうか、別名をつけてやるのが良いかと。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6