Rails-将二维数组转换为列表并返回

时间:2019-05-31 00:21:58

标签: ruby-on-rails arrays ruby ruby-on-rails-5

我有一个像这样的数组:

[["09:00",4,15],["09:00",4,15]]

我想在这样的文本区域中输出它:

"09:00",4,15
"09:00",4,15

用户可以对其进行编辑,然后我想将其转换回具有子数组的数组。

第一步,我可以做一个each并用[]删除gsub,但这似乎不是最好的方法。然后将其转换为数组,我将需要更多代码。

有点像CSV输出,但是我在这里不使用任何文件。

2 个答案:

答案 0 :(得分:3)

要产生输出,可以执行以下操作:

input = [["09:00",4,15],["09:00",4,15]]

output = input
  .map { |list| list.join(",") }
  .join("\n")

puts output

打印:

09:00,4,15
09:00,4,15

然后您可以使用split将其转换为输入:

result = output
  .split("\n")
  .map { |line| line.split(",") }
# => [["09:00", "4", "15"], ["09:00", "4", "15"]]

您可能已经注意到,问题在于数字被转换为字符串。这是因为当您在页面上打印某些内容时,不可避免地将其转换为字符串,而Ruby无法只是知道它应该是数字。

如果需要,可以将第二个和第三个元素转换为数字:

result2 = result.map do |(time, num1, num2)|
  [time, num1.to_i, num2.to_i]
end

答案 1 :(得分:1)

给予

arr = [["09:00",4,15],["09:00",4,15]]

您可以使用标准库中的CSV模块:

require 'csv'

lines = CSV.generate {|csv| arr.each(&csv.method(:<<))}
# => "09:00,4,15\n09:00,4,15\n"

CSV.parse(lines, converters: :integer)
# => [["09:00", 4, 15], ["09:00", 4, 15]]