Sha256: 12de3b34cae44f66c7d791b1b73bec9597f97e1c73e98c8223b419635b2251ed

Contents?: true

Size: 901 Bytes

Versions: 1

Compression:

Stored size: 901 Bytes

Contents

class ObjectFlatten
  class << self
    def flatten(obj, options = {})
      unless obj.is_a?(Hash)
        raise TypeError, "TypeError: wrong argument type #{obj.class} (expected Hash)"
      end

      options = {
        :separator => '.',
      }.merge(options)

      flatten0(nil, obj, options)
    end

    private

    def flatten0(root, obj, options, acc = [])
      case obj
      when Array
        obj.each do |value|
          flatten0(root, value, options, acc)
        end
      when Hash
        obj.each do |key, value|
          flatten0(join(root, key, options), value, options, acc)
        end
      else
        acc << {root => obj}
      end

      acc
    end

    def join(root, key, options)
      key = key.to_s
      sep = options[:separator]
      tr = options[:tr]

      if tr
        key = key.tr(*tr)
      end

      root ? (root + sep + key) : key
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
object_flatten-0.1.1 lib/object_flatten/object_flatten.rb