2017-08-31 3 views
3

Ich habe die folgenden zwei Felder:Kombinieren Sie zwei Arrays mit prepend

months = ["2017_01", "2017_02", "2017_03"] 
codes = ["abc","efg"] 

ich sie in einem Array verbinden wollen, wie folgt:

result = ["abc_2017_01", "abc_2017_02", "abc_2017_03", 
      "efg_2017_01", "efg_2017_02", "efg_2017_03"] 

ich verschiedene Dinge ausprobiert habe, aber halten Sie endet up mit Werten wie abc_efg_2017_01 usw. Jedes der ursprünglichen Arrays kann eine beliebige Größe haben, ich habe nur kleine Arrays verwendet, um das Problem zu veranschaulichen.

Kann jemand eine nette, prägnante Art vorschlagen, dies zu tun?

Antwort

8
codes.product(months).map { |vals| vals.join('_') } 
#⇒ [ 
# [0] "abc_2017_01", 
# [1] "abc_2017_02", 
# [2] "abc_2017_03", 
# [3] "efg_2017_01", 
# [4] "efg_2017_02", 
# [5] "efg_2017_03" 
# ] 

NB Check Kommentare für sauberere Ansätze.

+5

Sie brauchen nicht zu Splat 'Vals' hier:' codes.product (Monate) .map {| * vals | vals.join ('_')} == codes.product (Monate) .map {| vals | vals.join ('_')} # => true' –

+0

Das ist genau richtig, danke! So einfach. – Raoot

+0

@MichaelKohl Ich weiß; Ich bin sicher, dass splat es hier prägnanter macht. – mudasobwa

3
codes.flat_map do |c| 
    months.map { |m| "#{c}_#{m}" } 
end 

Ausgang:

=> ["abc_2017_01", "abc_2017_02", "abc_2017_03", "efg_2017_01", "efg_2017_02", "efg_2017_03"] 
+0

Gute Idee. Danke @mudasobwa – max

1

Auch Matrix die Rettung sein könnte:

require 'matrix' 
Matrix.build(codes.size, months.size) { |row, col| "#{codes[row]}_#{months[col]}" } 
     .to_a.flatten 
#=> ["abc_2017_01", "abc_2017_02", "abc_2017_03", 
# "efg_2017_01", "efg_2017_02", "efg_2017_03"] 

Oder das gleiche mit Arrays:

Array.new(codes.size) do |i| 
    Array.new(months.size) { |j| "#{codes[i]}_#{months[j]}"} 
end.flatten 
#=> ["abc_2017_01", "abc_2017_02", "abc_2017_03", 
# "efg_2017_01", "efg_2017_02", "efg_2017_03"]