Sha256: be1cf6f6311fffd7f7ab9f54a973b9b26e99ea4b247ff3de2fed515f421cc87f

Contents?: true

Size: 658 Bytes

Versions: 30

Compression:

Stored size: 658 Bytes

Contents

# frozen_string_literal: true

module HashExtensions
  def to_nested
    self unless contains_dotted_key?

    keys.reduce({}) do |nested, key|
      nested.deep_merge(build_nested_object(key, self[key]))
    end
  end

  def deep_merge(hash_to_merge)
    merger = proc { |_, val1, val2| val1.is_a?(Hash) && val2.is_a?(Hash) ? val1.merge(val2, &merger) : val2 }
    merge(hash_to_merge, &merger)
  end

  private

  def contains_dotted_key?
    keys.any? { |x| x.to_s.include?('.') }
  end

  def build_nested_object(key, val)
    key.to_s
       .split('.')
       .reverse
       .reduce(val) { |nested, key_part| { key_part.to_sym => nested } }
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
twiglet-3.8.0 lib/hash_extensions.rb
twiglet-3.7.2 lib/hash_extensions.rb
twiglet-3.7.1 lib/hash_extensions.rb
twiglet-3.7.0 lib/hash_extensions.rb
twiglet-3.6.6 lib/hash_extensions.rb
twiglet-3.6.5 lib/hash_extensions.rb
twiglet-3.6.4 lib/hash_extensions.rb
twiglet-3.6.3 lib/hash_extensions.rb
twiglet-3.6.2 lib/hash_extensions.rb
twiglet-3.6.1 lib/hash_extensions.rb
twiglet-3.6.0 lib/hash_extensions.rb
twiglet-3.5.4 lib/hash_extensions.rb
twiglet-3.5.2 lib/hash_extensions.rb
twiglet-3.5.1 lib/hash_extensions.rb
twiglet-3.5.0 lib/hash_extensions.rb
twiglet-3.4.9 lib/hash_extensions.rb
twiglet-3.4.8 lib/hash_extensions.rb
twiglet-3.4.3 lib/hash_extensions.rb
twiglet-3.4.2 lib/hash_extensions.rb
twiglet-3.4.1 lib/hash_extensions.rb