2013-03-06 3 views
2

Не зная размерности массива, как преобразовать массив в вложенный хеш?Преобразование вложенного массива в вложенный хэш в Ruby

Например:

[["Message", "hello"]] 

к:

{{:message => "Hello"}} 

Или:

[["Memory", [["Internal Memory", "32 GB"], ["Card Type", "MicroSD"]]]] 

к:

{{:memory => {:internal_memroy => "32 GB", :card_type => "MicroSD"}}} 

или:

[["Memory", [["Internal Memory", "32 GB"], ["Card Type", "MicroSD"]]], ["Size", [["Width", "12cm"], ["height", "20cm"]]]] 

к:

{ {:memory => {:internal_memroy => "32 GB", :card_type => "MicroSD"}, {:size => {:width => "12cm", :height => "20cm" } } } 
+2

Ваш первый пример не является вложенным массив, но хэш внутри массива. – Mischa

+0

Подробнее о продукте [["Memory", [["Internal Memory", "32 GB"], ["Тип карты", "MicroSD"]]]] Внешний вид массива? Технически это можно интерпретировать как ключ (т. Е. Весь массив на следующем уровне вложенности - это ключ), но не имеет значения во внешнем хеше - вам может потребоваться предоставить больше примеров или объяснить, как массивы строятся так, что все ваши чехлы могут быть покрыты –

+0

@Mischa Извините, для типографии .. – codeit

ответ

-1
> [:Message => "hello"] 
=> [{:Message=>"hello"}] 

Таким образом:

> [:Message => "hello"][0] 
=> {:Message=>"hello"} 
+0

Извините, что вы ответили на исходный код, который был изменен. – PhilT

1

Учитывая свой формат вложенных массивов пар, что следующая функция преобразует его в хэш вас» d like

def nested_arrays_of_pairs_to_hash(array) 
    result = {} 
    array.each do |elem| 
    second = if elem.last.is_a?(Array) 
     nested_arrays_to_hash(elem.last) 
    else 
     elem.last 
    end 
    result.merge!({elem.first.to_sym => second}) 
    end 
    result 
end 

Более короткая версия

def nested_arrays_to_hash(array) 
    return array unless array.is_a? Array 
    array.inject({}) do |result, (key, value)| 
    result.merge!(key.to_sym => nested_arrays_to_hash(value)) 
    end 
end