Skip to content

Instantly share code, notes, and snippets.

@thenoseman
Created June 23, 2016 09:21
Show Gist options
  • Save thenoseman/f8954aaca6a1a5a9d50ca35ceca01ba2 to your computer and use it in GitHub Desktop.
Save thenoseman/f8954aaca6a1a5a9d50ca35ceca01ba2 to your computer and use it in GitHub Desktop.
Add #deep_find and #deep_transform_values and #deep_transform_keys to Hash
class Hash
def deep_transform_values(&block)
_deep_transform_values_in_object(self, &block)
end
def deep_transform_values!(&block)
_deep_transform_values_in_object!(self, &block)
end
def deep_find(key)
key?(key) ? self[key] : self.values.inject(nil) {|memo, v| memo ||= v.deep_find(key) if v.respond_to?(:deep_find) }
end
private
def _deep_transform_values_in_object(object, &block)
case object
when Hash
object.each_with_object({}) do |(key, value), result|
result[key] = _deep_transform_values_in_object(value, &block)
end
when Array
object.map {|e| _deep_transform_values_in_object(e, &block) }
else
yield(object)
end
end
def _deep_transform_values_in_object!(object, &block)
case object
when Hash
object.each do |key, value|
object[key] = _deep_transform_values_in_object!(value, &block)
end
when Array
object.map! {|e| _deep_transform_values_in_object!(e, &block) }
else
yield(object)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment