Skip to content

Instantly share code, notes, and snippets.

@brentdodell
Last active December 23, 2018 17:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brentdodell/f5e336ac8ed8f83082a4f832a7cd5807 to your computer and use it in GitHub Desktop.
Save brentdodell/f5e336ac8ed8f83082a4f832a7cd5807 to your computer and use it in GitHub Desktop.
Hash extensions
class Hash
def sample(n = 1)
Hash[to_a.sample(n)]
end
def deep_flatten
flat_map { |k, v| [k, *(v.respond_to?(:deep_flatten) ? v.deep_flatten : v)] }
end
def flat_join_keys(prefix: nil, separator: '-', memo: {})
each do |key, value|
joined_key = [prefix, key].compact.join(separator).underscore.to_sym
if value.respond_to?(:flat_join_keys)
value.flat_join_keys(prefix: key, memo: memo)
else
memo[joined_key] = value
end
end
memo
end
end
@brentdodell
Copy link
Author

  • Hash#sample(n = 1): retrieve n number of random key/value pairs out of hash

  • Hash#deep_flatten: flatten hash into one dimensional Array, ie:

{
  level1_a: {
    level2_a: :hello,
    level2_b: :world,
  },
  level1_b: :hi,
}

becomes

[:level1_a, :level2_a, :hello, :level2_b, :world, :level1_b, :hi]
  • Hash#flat_join_keys: flatten a multi-dimensional hash down to one level, joining parent keys with sub-keys, ie:
{
    level1_a: {
    level2_a: 'hello',
    level2_b: 'world',
  },
  level1_b: 'hi!'
}

becomes

{
  level1_a_level2_a: 'hello',
  level1_a_level2_b: 'world',
  level1_b: 'hi!',
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment