Class: Hash
- Inherits:
-
Object
- Object
- Hash
- Defined in:
- lib/indexer/core_ext/hash/to_h.rb,
lib/indexer/core_ext/hash/rekey.rb
Instance Method Summary collapse
-
#rekey(key_map = nil, &block) ⇒ Object
Rekey a hash:.
-
#rekey!(key_map = nil, &block) ⇒ Object
Synonym for Hash#rekey, but modifies the receiver in place (and returns it).
- #to_h ⇒ Object
Instance Method Details
#rekey(key_map = nil, &block) ⇒ Object
Rekey a hash:
rekey() rekey(from_key => to_key, ...) rekey{|from_key| to_key} rekey{|from_key, value| to_key}
If a key map is given, then the first key is changed to the second key.
foo = { :a=>1, :b=>2 } foo.rekey(:a=>'a') #=> { 'a'=>1, :b=>2 } foo.rekey(:b=>:x) #=> { :a =>1, :x=>2 } foo.rekey('foo'=>'bar') #=> { :a =>1, :b=>2 }
If a block is given, converts all keys in the Hash accroding to the given block procedure. If the block returns +NA+ for a given key, then that key will be left intact.
foo = { :name=>'Gavin', :wife=>:Lisa } foo.rekey{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa } foo #=> { :name =>"Gavin", :wife=>:Lisa }
If no key map or block is given, then all keys are converted to Symbols.
Note that if both a +key_map+ and a block are given, the +key_map+ is applied first then the block.
CREDIT: Trans, Gavin Kistner
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/indexer/core_ext/hash/rekey.rb', line 35 def rekey(key_map=nil, &block) if !(key_map or block) block = lambda{|k| k.to_sym} end key_map ||= {} hash = dup.replace({}) # to keep default_proc (keys - key_map.keys).each do |key| hash[key] = self[key] end key_map.each do |from, to| hash[to] = self[from] if key?(from) end if block hash2 = dup.replace({}) case block.arity when 2 # TODO: is this condition needed? hash.each do |k, v| nk = block.call(k,v) nk = (nk ? nk : k) hash2[nk] = v end else hash.each do |k, v| nk = block.call(k) nk = (nk ? nk : k) hash2[nk] = v end end else hash2 = hash end hash2 end |
#rekey!(key_map = nil, &block) ⇒ Object
Synonym for Hash#rekey, but modifies the receiver in place (and returns it).
foo = { :name=>'Gavin', :wife=>:Lisa } foo.rekey!{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa } foo #=> { "name"=>"Gavin", "wife"=>:Lisa }
CREDIT: Trans, Gavin Kistner
83 84 85 |
# File 'lib/indexer/core_ext/hash/rekey.rb', line 83 def rekey!(key_map=nil, &block) replace(rekey(key_map, &block)) end |
#to_h ⇒ Object
2 |
# File 'lib/indexer/core_ext/hash/to_h.rb', line 2 def to_h; self; end |