2012-05-22 3 views
-1

У меня есть массив Ruby, элементы которого чередуются между строками и хэшами. Например:Ruby mixed array to inested hash

["1234", Hash#1, "5678", Hash#2] 

Я хотел бы создать вложенную структуру хэша из этого. Таким образом,

hash["1234"]["key in hash#1"] = value 
hash["5678"]["key in hash#2"] = value 

У кого-нибудь есть/сейчас хороший способ сделать это? Спасибо.

+2

Не совсем понятно, что вы хотите здесь. Вы хотите взять каждый второй элемент из массива (который должен быть хешем) и создать ключ, используя предыдущий элемент в массиве с хеш-значением, которое вы создаете на основе существующих ключей в исходном хэше (2-й элемент в массив)? – coreyward

+1

хэши могут иметь более одного ключа/значения, куда бы они пошли? попробуйте использовать действительный Ruby в примерах. Это проще, если вы скажете: 1) У меня есть этот массив (реальный массив) и 2) Я хочу этот результат, и 3) Это то, что я пробовал до сих пор. – tokland

+1

Я отклонил ваш вопрос, потому что это неясно. Если вы отредактируете свой вопрос, чтобы выяснить, какие реальные данные могут выглядеть, и что вы хотите совершить с этими данными, я с радостью верну свое голосование. – Phrogz

ответ

5

Просто используйте

hsh = Hash[*arr] #suppose arr is the array you have 

Это будет порезать 2 за один раз и конвертировать в хэш.

+1

Вам нужен 'Hash [* arr]', но +1 для отличной точки! – Phrogz

+0

@Phrogz да вы правы :) – texasbruce

2

Я не думаю, что есть метод на массиве, чтобы сделать это напрямую. Следующий код работает и довольно легко читается.

hsh = {} 

ary.each_slice(2) do |a, b| 
    hsh[a] = b 
end 

# Now `hsh` is as you want it to be 
+0

Упрощение: 'hsh = Hash [ary.each_slice (2) .to_a]' (см. Мой ответ). – Phrogz

1

Гадание на то, что вы хотите, так как «ключ в хэш # 1» не понятно вообще, ни у вас определили, что hash или value должно быть:

value = 42 

h1 = {a:1} 
h2 = {b:2} 
a = ["1234",h1,"5678",h2] 
a.each_slice(2).each{ |str,h| h[str] = value } 
p h1, #=> {:a=>1, "1234"=>42} 
    h2 #=> {:b=>2, "5678"=>42} 

В качестве альтернативы, возможно, вы имеете в виду это:

h1 = {a:1} 
h2 = {b:2} 
a = ["1234",h1,"5678",h2] 

hash = Hash[ a.each_slice(2).to_a ] 
p hash    #=> {"1234"=>{:a=>1}, "5678"=>{:b=>2}} 
p hash["1234"][:a] #=> 1 
1

догадки давайте, используя грань просто для удовольствия:

require 'facets' 
xs = ["1234", {:a => 1, :b => 2}, "5678", {:c => 3}] 
xs.each_slice(2).mash.to_h 
#=> {"1234"=>{:a=>1, :b=>2}, "5678"=>{:c=>3}} 
+0

Уже покрыт ответом ksol (в менее эффективной форме) и моим ответом (напрямую). – Phrogz

+1

@Phrogz: ОК, изменен на грани, чтобы показать что-то новое. – tokland

+0

Ну, нет ничего плохого в рисовании из другого ответа, чтобы получить наилучший ответ. (Я говорю явно, что вы должны добавить версию «Hash []» к вашему ответу, особенно если вы получите accept.) Раньше ваш ответ был просто дублирующим, но теперь он + 1able :) – Phrogz