エンジニアリングにはほど遠い

iPhoneアプリとかサイトとかをつくっていくブログです。

Ruby Hashのkeyをsymbolに変換する

hashの中のarrayの中にもhashがあったときの事を考えて書きました。

config/initializers/hash.rb

class Hash
  def keys_to_sym
    each_with_object({}) do |(k, v), hash|
      hash[k.to_sym] = v.respond_to?(:keys_to_sym) ? v.keys_to_sym : v
    end
  end
end

config/initializers/array.rb

class Array
  def keys_to_sym
    map{|v| v.respond_to?(:keys_to_sym) ? v.keys_to_sym : v }
  end
end

pryで実行

[1] pry(main)> [:s, {"ddd" => :ddd}, {fff: {"sda" => "sds"}}]
=> [:s, {"ddd"=>:ddd}, {:fff=>{"sda"=>"sds"}}]
[2] pry(main)> [:s, {"ddd" => :ddd}, {fff: {"sda" => "sds"}}].keys_to_sym
=> [:s, {:ddd=>:ddd}, {:fff=>{:sda=>"sds"}}]

Railsで使用。こうやって拡張するのがやりやすくていいですね。iOSでいうところのカテゴリ+.pchでのインポートみたいな感じですね。

2015/6/16 追記
deep_symbolize_keysはhash中のarray中のhashはsymbolizeしないらしい。