diff options
author | Mark McSpadden <markmcspadden@gmail.com> | 2012-05-23 12:31:35 -0500 |
---|---|---|
committer | Mark McSpadden <markmcspadden@gmail.com> | 2012-05-23 13:11:06 -0500 |
commit | 2b5b60fc3c4251536b837937391ebdd028892b15 (patch) | |
tree | 94f6cbd72dba9be3f9bf15e422f6d45642dc7122 /activesupport/lib | |
parent | 541429fbe49b0671adb3842ab1818230d670ef9f (diff) | |
download | rails-2b5b60fc3c4251536b837937391ebdd028892b15.tar.gz rails-2b5b60fc3c4251536b837937391ebdd028892b15.tar.bz2 rails-2b5b60fc3c4251536b837937391ebdd028892b15.zip |
Add Hash#deep_transform_keys and Hash#deep_transform_keys! Also convert deep_*_keys to use deep_transform_keys.
Diffstat (limited to 'activesupport/lib')
-rw-r--r-- | activesupport/lib/active_support/core_ext/hash/keys.rb | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/activesupport/lib/active_support/core_ext/hash/keys.rb b/activesupport/lib/active_support/core_ext/hash/keys.rb index 5eb861934d..362d584ba1 100644 --- a/activesupport/lib/active_support/core_ext/hash/keys.rb +++ b/activesupport/lib/active_support/core_ext/hash/keys.rb @@ -65,47 +65,56 @@ class Hash end end - # Return a new hash with all keys converted to strings. + # Return a new hash with all keys converted by the block operation. # This includes the keys from the root hash and from all # nested hashes. - def deep_stringify_keys + # + # { :person => { :name => 'Rob', :years => '28' } }.deep_transform_keys{ |key| key.to_s.upcase } + # # => { "PERSON" => { "NAME" => "Rob", "YEARS" => "28" } } + def deep_transform_keys(&block) result = {} each do |key, value| - result[key.to_s] = value.is_a?(Hash) ? value.deep_stringify_keys : value + result[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value end result end - # Destructively convert all keys to strings. + # Destructively convert all keys by using the block operation. # This includes the keys from the root hash and from all # nested hashes. - def deep_stringify_keys! + def deep_transform_keys!(&block) keys.each do |key| - val = delete(key) - self[key.to_s] = val.is_a?(Hash) ? val.deep_stringify_keys! : val + value = delete(key) + self[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys!(&block) : value end self end + # Return a new hash with all keys converted to strings. + # This includes the keys from the root hash and from all + # nested hashes. + def deep_stringify_keys + deep_transform_keys{ |key| key.to_s } + end + + # Destructively convert all keys to strings. + # This includes the keys from the root hash and from all + # nested hashes. + def deep_stringify_keys! + deep_transform_keys!{ |key| key.to_s } + end + # Destructively convert all keys to symbols, as long as they respond # to +to_sym+. This includes the keys from the root hash and from all # nested hashes. def deep_symbolize_keys! - keys.each do |key| - val = delete(key) - self[(key.to_sym rescue key)] = val.is_a?(Hash) ? val.deep_stringify_keys! : val - end - self + deep_transform_keys!{ |key| key.to_sym rescue key } end # Return a new hash with all keys converted to symbols, as long as # they respond to +to_sym+. This includes the keys from the root hash # and from all nested hashes. def deep_symbolize_keys - result = {} - each do |key, value| - result[(key.to_sym rescue key)] = value.is_a?(Hash) ? value.deep_symbolize_keys : value - end - result + deep_transform_keys{ |key| key.to_sym rescue key } end end |