Class: Hash
- Inherits:
-
Object
- Object
- Hash
- Defined in:
- lib/values_at_nested/core_ext/hash/values_at_nested.rb
Instance Method Summary collapse
- #iterate_over_nested(keys) ⇒ Object
-
#values_at_nested(*nested_keys) ⇒ Object
Returns an array that holds the values of the given keys list of various depth.
Instance Method Details
#iterate_over_nested(keys) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/values_at_nested/core_ext/hash/values_at_nested.rb', line 17 def iterate_over_nested(keys) keys.collect do |key| value = self[key] if key.is_a?(Hash) key.collect do |k, v| if Hash === v yield [k, v.iterate_over_nested(v.keys) { |kn| kn }].flatten elsif Array === v v.collect { |vi| yield [k, vi] } else yield [k, v] end end.flatten 1 elsif key.is_a?(Symbol) && value.is_a?(Hash) value.iterate_over_nested(value.keys) { |k| yield [key, k]} elsif key.is_a?(Symbol) && value.is_a?(Symbol) yield [key, value] else yield key end end end |
#values_at_nested(*nested_keys) ⇒ Object
Returns an array that holds the values of the given keys list of various depth.
Example:
hash = { a: 58, b: { x: true, y: false }, c: nil }
hash.values_at_nested(:b, :c) # => [58, nil]
hash.values_at_nested(:a, b: [:x]) # => [58, [true]]
hash.values_at_nested(:a, b: [:x, :y]) # => [58, [true, false]]
13 14 15 |
# File 'lib/values_at_nested/core_ext/hash/values_at_nested.rb', line 13 def values_at_nested(*nested_keys) nested_keys.empty? ? [] : iterate_over_nested(nested_keys) { |k| self.dig(*k) } end |