2014-09-30 4 views
0

У меня есть этот массив:Наполнение хэша из массива

params[:types] = [type1, type2, type3...] 

Я хотел бы, чтобы заполнить мой хэш следующим образом, используя вышеупомянутую массив:

params[:hash] = { 
       "type1" => { 
        something: something 
       }, 
       "type2" => { 
        something: something 
       }, 
      } 

Использование for петли как for index in i ...params[:types] просто заполняет хэш с последним значением в массиве.

+0

Вы, не пытались что-нибудь? –

ответ

3

Вы можете использовать метод each_with_object сделать это:

params = {} 
params[:types] = ["type1", "type2", "type3"] 
params[:types].each_with_object({}) { |k, h| h[k] = { "something" => "something" } } 

Последняя строка будет возвращать:

=> {"type1"=>{"something"=>"something"}, "type2"=>{"something"=>"something"}, "type3"=>{"something"=>"something"}} 
+0

Вместо 'inject', используйте' each_with_object'. В результате получается более чистый код: 'params [: types] .each_with_object ({}) {| k, h | h [k] = {"something" => "something"}} ', потому что нет необходимости возвращать' hash' в конце блока. 'each_with_object' знает, как повторно использовать это значение. –

+0

Ах, круто! Спасибо за подсказку, только что узнал! Я уточню свой ответ. –

+0

Нет необходимости добавлять комментарии «Редактировать: ...». Между моим комментарием к вашему ответу и нашей способностью видеть историю изменений изменений в вашем ответе, мы можем понять, что было сказано. (Все вопросы и ответы на Stack Overflow имеют историю изменений, которые могут видеть пользователи выше определенной репутации. Иногда это бывает очень удобно.) –

1

Вот фрагмент кода пример, который делает то, что вам нужно.

hash = {} 
array.each do |a|             
    hash[a.to_s] = { "something" => "something" }     
end 

выход:

hash                
=> { 
    "type1" => { 
    "something" => "something" 
    }, 
    "type2" => { 
    "something" => "something" 
    }, 
    "type3" => { 
    "something" => "something" 
    } 
} 
+0

Предполагая, что 'a.to_s' предназначен для преобразования значение (скажем) переменной 'type1' для строки, нет оснований заключать, что это будет' 'type1" '. Лучше, я думаю, просто предположить, что OP означает 'params [: types] = [" type1 "," type2 "," type3 "...]' и drop '.to_s'. –

0

Вы можете сделать это:

params = { types: ["type1", "type2", "type3"] } 

Hash[params[:types].product([{"something" => "something"}])] 
    #=> {"type1"=>{"something"=>"something"}, 
    # "type2"=>{"something"=>"something"}, 
    # "type3"=>{"something"=>"something"}} 

и с Рубином 2.1,

params[:types].product([{"something" => "something"}]).to_h 

Если вы хотите другой хэш для каждого элемента params[:types]:

hashes = [{ "something1"=>"something1" }, { "something2"=>"something2" }, 
      { "something3"=>"something3" }] 

затем

Hash[params[:types].zip(hashes)] 
    #=> {"type1"=>{"something1"=>"something1"}, 
    # "type2"=>{"something2"=>"something2"}, 
    # "type3"=>{"something3"=>"something3"}} 
Смежные вопросы