Module: Celsius::Hash
- Defined in:
- lib/celsius/hash.rb
Class Method Summary collapse
-
.deep_find_key(object, key) ⇒ Object
This module provides some helper functions for dealing with hashes.
- .smart_fetch(hash, key) ⇒ Object
- .smart_store(hash, key, value) ⇒ Object
Class Method Details
.deep_find_key(object, key) ⇒ Object
This module provides some helper functions for dealing with hashes
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/celsius/hash.rb', line 7 def self.deep_find_key(object, key) results = [] if key.is_a?(Array) key.inject(object) do |memo, key_element| deep_find_key(memo, key_element) end else if object.is_a?(Array) # flatten(1) prevents unintend array nesting due to recursion results.concat object.map { |value| deep_find_key(value, key) }.flatten(1) elsif object.is_a?(Hash) if object.has_key?(key.to_s) || object.has_key?(key.to_sym) results << (object[key.to_s] || object[key.to_sym]) else # its easier to concat an empty array than checking for nil results.concat deep_find_key(object.values, key) || [] end end # remove nils results.compact! # in case nothing was found, return nil to ease detecting this case results.empty? ? nil : results end end |
.smart_fetch(hash, key) ⇒ Object
35 36 37 38 |
# File 'lib/celsius/hash.rb', line 35 def self.smart_fetch(hash, key) result = hash[key.to_s] result = result.nil? ? hash[key.to_sym] : result end |
.smart_store(hash, key, value) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/celsius/hash.rb', line 40 def self.smart_store(hash, key, value) if hash[key] unless hash[key].is_a?(Array) hash[key] = [hash[key]] end hash[key].push(value) else hash[key] = value end hash end |