2015-06-08 2 views
1

Я хочу получить массив хэшей.Создайте хэш из переменных в цикле

Я начинаю с массивом кодов:

@codes = ['123', '456', '789'] 

Я принимаю каждый из этих кодов и ударил API с ними, и он возвращает значения, которые я анализирую в переменные в цикле, например, так:

@codes.each do |x| 
    @y = x.get_some_data 
    @brand = @y[brand] 
    @size = @y[size] 
end 

Тогда я хочу, чтобы поместить эти данные в массив хэшей

merged_array = [] 
final_hash = @codes.map{|code| {:code => code, :brand=> @brand, :size=> @size} 
merged_array << final_hash 

И в идеальном мире, е й с хэшей, которые выглядят, как это в merged_array:

{:code => '123', :brand=> 'nike', :size=> 8 } 
{:code => '456', :brand=> 'adidas', :size=> 4 } 
{:code => '789', :brand=> 'converse', :size=> 10 } 

Но когда я бегу мой сценарий он отображает коды правильно, но перезаписывает @brand, @size переменные и просто возвращает значения последнего цикла.

Не знаете, как получить все мои переменные в хеши?

+0

вместо раздела 'codes.each' просто поместить всю эту логику непосредственно в метод' map', также, вероятно, нет необходимости в переменных экземпляра, так как вы просто отбросите эти данные в любом случае. – engineersmnky

ответ

3

В вашем примере кода все переменные объявлены как переменные экземпляра, поскольку они имеют префикс @.

Однако переменные в цикле являются просто рабочими/временными переменными, а не переменными экземпляра. Кроме того, x.get_some_data, вероятно, не работает, поскольку x является только переменной цикла и содержит 456, abc и т. Д., А не объект с требуемым методом. Таким образом, следующий код должен дать желаемый результат:

def get_data(codes) 
    result = [] 
    codes.each do |code| 
    y = get_some_data(code) 
    result << { 
     code: code, 
     brand: y['brand'], 
     size: y['size'] 
    } 
    end 
    result 
end 

Это очень подробный пример; вы можете поместить всю логику в map, если это позволяет вернуть значение get_some_data.

Более элегантный вариант будет использовать Enumerable#each_with_object (Array класс включает Enumereable):

def get_data(codes) 
    codes.each_with_object([]) do |code, result| 
    y = get_some_data(code) 
    result << { 
     code: code, 
     brand: y['brand'], 
     size: y['size'] 
    } 
    end 
end 

Спасибо, Cary Swoveland, указывают на это!

+0

arghhhhh .. ответ был действительно вашей первой строкой .. экземпляр против переменных temp .. Я поменял их на переменные method/temp, и теперь все работает нормально. Wow .. легко исправить, но я просто не видел Это!! Большое спасибо – ToddT

+1

Небольшое предложение: вместо 'result = []' в начале и 'result' в конце,' codes.each_with_object ([]) {| code, result | ... '. –

+0

Хорошая идея, @CarySwoveland, я отредактировал свой ответ соответственно. – Technaton

1

Это должно сделать работу

@codes.map{|code| {:code => code, :brand => code.get_some_data['brand'], code.get_some_data['size']}} 

Но, я действительно не уверен, что String.get_some_data даст вам. Например: '123'.get_some_data['brand']

Смежные вопросы