Преобразование "массив в хэш" в Ruby - PullRequest
1 голос
/ 09 сентября 2010

Мне нужно преобразовать ["a", "b", "c", "d"] в {:a => {:b => {:c => "d" }}}?

Есть идеи?

Спасибо

Ответы [ 4 ]

4 голосов
/ 09 сентября 2010

смешно

ruby-1.8.7-p174 > ["a", "b", "c", "d"].reverse.inject{|hash,item| {item.to_sym => hash}}
 => {:a=>{:b=>{:c=>"d"}}}
3 голосов
/ 09 сентября 2010

Мне нравится:

class Array
  def to_weird_hash
    length == 1 ? first : { first.to_sym => last(length - 1).to_weird_hash }
  end
end

["a", "b", "c", "d"].to_weird_hash

Что ты думаешь?

2 голосов
/ 09 сентября 2010

Если вам нужно сделать это для ровно 4 элементов, достаточно просто написать это (и вполне читабельно)

>> A=["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
>> {A[0].to_sym => {A[1].to_sym => {A[2].to_sym => A[3]}}}
=> {:a=>{:b=>{:c=>"d"}}}

В противном случае это будет работать для массивов переменной длины

>> ["a", "b", "c", "d"].reverse.inject(){|a,e|{e.to_sym => a}}
=> {:a=>{:b=>{:c=>"d"}}}
>> ["a", "b", "c", "d", "e", "f"].reverse.inject(){|a,e|{e.to_sym => a}}
=> {:a=>{:b=>{:c=>{:d=>{:e=>"f"}}}}}
0 голосов
/ 09 сентября 2010

Я понял это с помощью IRC.

x = {}; a[0..-3].inject(x) { |h,k| h[k.to_sym] = {} }[a[-2].to_sym] = a[-1]; x

Второй способ с рекурсивом (лучше)

def nest(a)
  if a.size == 2
    { a[0] => a[1] }
  else
    { a[0] => nest(a[1..-1]) }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...