2015-03-10 2 views
0

ОБНОВЛЕНИЕ: мне удалось немного реорганизовать код, но это все еще вложенный цикл.Рефакторинг каждого цикла

Я думаю, что я разработал способ улучшить код, используя map и keep_if. Я не знаю, что это идеальный вариант, потому что это все еще вложенный цикл. выход = {}

array.map do |a| 
    output[a[0]] = another_array.dup.keep_if do |b| 
    a[1].include?(b["name"]) 
    end 
end 

Это немного n00b вопрос. Я пытаюсь выяснить, как я могу реорганизовать вложенный каждый цикл, как тот, который приведен ниже, чтобы я не объявлял дополнительные переменные, которые мне не понадобятся позже, и чтобы мой код работал быстрее.

some_array = [["one", 2, 3], ["two", 3, 4], ["three", 4, 5]] 
output = {} 

some_array.each do |a| 
    current_group = [] 

    another_array.each do |b| 
    current_group << b if something == true 
    end 

    output[a[0]] = current_group 
end 

The output возвращается как хэш массивов. some_array - это вложенный массив, в котором первым элементом в каждом под-массиве является строка, а another_array - это массив хэшей.

+0

Что такое 'group'? –

+2

Возможно, вы хотите ['.inject'] (http://ruby-doc.org/core-2.2.1/Enumerable.html#method-i-inject) – Jon

+0

Как ваш внешний цикл не использует' a'? – ruakh

ответ

0

Я не могу точно сказать, что вы делаете из этого кода - что такое group? Как условие связывает some_array и other_array вместе? Но в целом, если вы хотите построить новый массив или хеш, то идиома для достижения - это что-то с inject (a.k.a. reduce). Образец таков:

output = some_array.inject({}) do |partial_output, item| 
    ... 
    new value of partial_output after this loop iteration 
end 
Смежные вопросы