Классический хэш в хэш с точечной нотацией

Есть ли простой способ в Ruby 2/Rails 3 преобразовать это:

{a: {b: {"1" => 1, "2" => 2}, d: "Something"}, b: {c: 1}}

в это:

{"a.b.1" => 1, "a.b.2" => 2, "a.d" => "Something", "b.c" => 1}

Я не говорю об этом точном хэше, но преобразую любой хэш в хэш с точечной нотацией.


person Oktav    schedule 03.07.2013    source источник
comment
возможный дубликат преобразования вложенного хэша в плоский хеш. Не совсем то же самое, но может быть применено с незначительными изменениями.   -  person sawa    schedule 03.07.2013
comment
Да, может, присоединившись к массиву. Спасибо!   -  person Oktav    schedule 04.07.2013


Ответы (1)


Вот самое чистое решение, которое я мог придумать прямо сейчас:

def dot_it(object, prefix = nil)
  if object.is_a? Hash
    object.map do |key, value|
      if prefix
        dot_it value, "#{prefix}.#{key}"
      else
        dot_it value, "#{key}"
      end
    end.reduce(&:merge)
  else
    {prefix => object}
  end
end

Тест:

input = {a: {b: {"1" => 1, "2" => 2}, d: "Something"}, b: {c: 1}}

p dot_it input

Выход:

{"a.b.1"=>1, "a.b.2"=>2, "a.d"=>"Something", "b.c"=>1}
person Dogbert    schedule 03.07.2013
comment
Как раз то, что мне было нужно. Спасибо! - person Oktav; 04.07.2013