将ruby .map的结果附加到数组中?

时间:2017-01-14 20:32:12

标签: ruby-on-rails arrays ruby

我正在尝试构建一个items数组。我循环浏览CSV文件,当我找到匹配项扩展项目列表时。请参阅以下代码:

items = Array.new
csv.each_with_index do |row,i|
   items << ["a","b","c"].map {|x| row.to_s.gsub(/XXXXXXXXXX/, x.downcase)}
end
puts items.length

这不会返回到所需的项目数组。我是否将地图的结果错误地附加到数组?

由于

2 个答案:

答案 0 :(得分:4)

是的,你在这里做错了:

items << ["a","b","c"].map

项目最终将作为嵌套数组。以下是这里发生的事情的一个例子:

arr = []
arr << [1].map { |x| x }
arr
# => [[1]]

相反,您可以使用+=

如果您使用splat运算符,也可以使用push

arr = []
arr.push *["a","b","c"].map { |x| x }
arr
# => ["a", "b", "c"]

答案 1 :(得分:0)

根据经验,如果你是:

  • 初始化一个空数组
  • 迭代元素,修改数组
  • 最后返回数组

有一种Ruby Enumerable方法可以帮助您!

在这种情况下,您可以使用flat_mapwith_index

csv = %w(1;2;3 4;5;6 7;8;9)

items = csv.flat_map.with_index do |row,i|
   ["a","b","c"].map {|x| row.to_s.gsub(/[159]/, x.downcase)}
end

p items
#=> ["a;2;3", "b;2;3", "c;2;3", "4;a;6", "4;b;6", "4;c;6", "7;8;a", "7;8;b", "7;8;c"]