Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
lib/indexer/core_ext/hash/to_h.rb,
lib/indexer/core_ext/hash/rekey.rb

Instance Method Summary collapse

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_hObject



2
# File 'lib/indexer/core_ext/hash/to_h.rb', line 2

def to_h; self; end