module Coaster::Util

Constants

ARRAY_START
FLATTEN_HASH_DELIMITER

Public Class Methods

flatten_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, breadcrumbs: [], array_start: nil) click to toggle source

array_start가 0이면 array를 {‘0’=>‘blah’, ‘1’=>‘vlah’} array_start가 1이면 array를 {‘1’=>‘blah’, ‘2’=>‘vlah’} array_start가 nil이면 그대로 [‘blah’, ‘vlah’] 로 처리

# File lib/coaster/util.rb, line 10
def flatten_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, breadcrumbs: [], array_start: nil)
  case object
  when Hash
    object.each_with_object({}) do |(key, value), memo|
      memo.merge!(flatten_hashify(value, delimiter: delimiter, breadcrumbs: breadcrumbs + [key], array_start: array_start))
    end
  when Array
    if array_start
      object.each.with_index(array_start).with_object({}) do |(element, ix), memo|
        memo.merge!(flatten_hashify(element, delimiter: delimiter, breadcrumbs: breadcrumbs + [ix], array_start: array_start))
      end
    else
      {breadcrumbs.join(delimiter) => object}
    end
  else
    {breadcrumbs.join(delimiter) => object}
  end
end
roughen_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, array_start: nil) click to toggle source

숫자로 된 키는 무조건 array로 처리함array_start는 nil일 경우 기본값은 Util::ARRAY_START = 0

# File lib/coaster/util.rb, line 31
def roughen_hashify(object, delimiter: FLATTEN_HASH_DELIMITER, array_start: nil)
  array_start ||= ARRAY_START

  step1 = object.each_with_object({}) do |(key, value), memo|
    sp_keys = key.split(delimiter)
    k = sp_keys.shift
    if sp_keys.present?
      memo[k] ||= {}
      memo[k][sp_keys.join(delimiter)] = value
    else
      memo[k] = value
    end
  end

  step2 = step1.each_with_object({}) do |(key, value), memo|
    case value
    when Hash
      memo[key] = roughen_hashify(value, delimiter: delimiter, array_start: array_start)
    else
      memo[key] = value
    end
  end

  array_keys = (array_start...(step2.keys.size+array_start)).to_a
  if array_keys == step2.keys.map(&:to_i).sort
    step3 = []
    array_keys.map(&:to_s).each do |k|
      step3 << step2[k]
    end
    step3
  else
    step2
  end
end