class Hash
Public Instance Methods
deep_merge(*keys, val)
click to toggle source
# File lib/ext.rb, line 49 def deep_merge(*keys, val) merge_target = keys.inject(self) { |h, k| h[k.numstr_to_i] } if keys.one? self[keys.last] = merge_target.merge(val) else if merge_target.kind_of?(Array) merge_to_array(*keys, merge_target, val) else merge_to_hash(*keys, merge_target, val) end end self end
extract!(*keys)
click to toggle source
# File lib/ext.rb, line 36 def extract!(*keys) keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) } end
insert_after(key, obj)
click to toggle source
# File lib/ext.rb, line 40 def insert_after(key, obj) splitter = self.keys.index(key) before_keys = self.keys[0..splitter] before = self.extract!(*before_keys) after = self.slice!(*before_keys) merged = before.merge(obj).merge(after) merged end
slice(*keys)
click to toggle source
# File lib/ext.rb, line 21 def slice(*keys) keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true) keys.each_with_object(self.class.new) { |k, hash| hash[k] = self[k] if has_key?(k) } end
slice!(*keys)
click to toggle source
# File lib/ext.rb, line 26 def slice!(*keys) keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true) omit = slice(*self.keys - keys) hash = slice(*keys) hash.default = default hash.default_proc = default_proc if default_proc replace(hash) omit end
Private Instance Methods
merge_to_array(*keys, target, val)
click to toggle source
# File lib/ext.rb, line 65 def merge_to_array(*keys, target, val) last_key = keys.pop keys.inject(self) { |h, k| h[k.numstr_to_i] }[last_key.numstr_to_i] = target.push(val) end
merge_to_hash(*keys, target, val)
click to toggle source
# File lib/ext.rb, line 70 def merge_to_hash(*keys, target, val) last_key = keys.pop keys.inject(self) { |h, k| h[k.numstr_to_i] }[last_key.numstr_to_i] = target.merge(val) end