Skip to content

Instantly share code, notes, and snippets.

@bodsch
Created June 30, 2017 09:14
Show Gist options
  • Save bodsch/22ac56c628f3aa5e1e0915a754bc3c1c to your computer and use it in GitHub Desktop.
Save bodsch/22ac56c628f3aa5e1e0915a754bc3c1c to your computer and use it in GitHub Desktop.
ruby monkey patches
# -----------------------------------------------------------------------------
# Monkey patches
# Modify `Object` (https://gist.github.com/Integralist/9503099)
# None of the above solutions work with a multi-level hash
# They only work on the first level: {:foo=>"bar", :level1=>{"level2"=>"baz"}}
# The following two variations solve the problem in the same way
# transform hash keys to symbols
# multi_hash = { 'foo' => 'bar', 'level1' => { 'level2' => 'baz' } }
# multi_hash = multi_hash.deep_string_keys
class Object
def deep_symbolize_keys
if( self.is_a?( Hash ) )
return self.inject({}) do |memo, (k, v)|
memo.tap { |m| m[k.to_sym] = v.deep_string_keys }
end
elsif( self.is_a?( Array ) )
return self.map { |memo| memo.deep_string_keys }
end
self
end
def deep_string_keys
if( self.is_a?( Hash ) )
return self.inject({}) do |memo, (k, v)|
memo.tap { |m| m[k.to_s] = v.deep_string_keys }
end
elsif( self.is_a?( Array ) )
return self.map { |memo| memo.deep_string_keys }
end
self
end
end
# -----------------------------------------------------------------------------
class Array
def compare( comparate )
to_set == comparate.to_set
end
end
# -----------------------------------------------------------------------------
# filter hash
# example:
# tags = [ 'foo', 'bar', 'fii' ]
# useableTags = tags.filter( 'fii' )
class Hash
def filter( *args )
if( args.size == 1 )
if( args[0].is_a?( Symbol ) )
args[0] = args[0].to_s
end
self.select { |key| key.to_s.match( args.first ) }
else
self.select { |key| args.include?( key ) }
end
end
end
# -----------------------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment