将两个数组与前置组合在一起

时间:2017-08-31 15:18:20

标签: ruby-on-rails ruby

我有以下两个数组:

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

我想将它们组合成一个数组,如下所示:

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

我尝试了各种各样的东西,但最后还是像abc_efg_2017_01这样的数据等等。每个原始数组都可以是任意大小,我只是使用小数组来说明问题。

有人能提出一个很好的简洁方法吗?

3 个答案:

答案 0 :(得分: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 检查有关更清洁方法的评论。

答案 1 :(得分:3)

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

输出:

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

答案 2 :(得分:1)

此外,Matrix可能是救援:

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"]

或与数组相同:

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"]