我有一个id号的数组(技术上是一个字符串)。
ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
我想将id组成一个如下所示的数组:
ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我发现这样做的唯一方法就是使用地图。
id_numbers = ids.split(/,\s?/).map(&:to_i)
但是,这会丢弃数组中的第一个数字,并将其替换为0。
id_numbers = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]
有没有更好的方法将字符串数组转换为常规数组?
答案 0 :(得分:5)
由于这实际上是JSON格式,答案很简单:
require 'json'
id_json = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
ids = JSON.load(id_json)
你的解决方案" lops off"第一个数字是因为你分裂的方式。第一个"数字"在你的系列中实际上是"[1"
,而Ruby不是一个数字,所以它默认转换为0。
答案 1 :(得分:3)
如果您不想使用JSON
,
ids.scan(/\d+/).map(&:to_i)
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
如果ids
可能包含负整数的字符串表示形式,请将正则表达式更改为/-?\d+/
。
答案 2 :(得分:0)
总结一下:由于字符串开头的非数字字符,你得到0
作为数组中的第一个元素:
p '[1'.to_i #=> 0
也许有更好的方式来接收原始字符串。如果没有其他方式来接收该字符串,您可以简单地摆脱第一个字符,并且您自己的解决方案将起作用:
ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"
p ids[1..-1].split(",").map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]
@tadman&{39}和@CarySwoveland的解决方案完美无缺。可替换地:
ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"
p ids.tr("^-0-9", ' ').split.map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]
请记住&:
首次出现在Ruby 1.8.7中。