1

我有一些数组

>> a = ["a..c", "0..2"]
=> ["a..c", "0..2"]

我需要将此数组转换为另一个数组

>> b = ("a".."c").to_a + (0..2).to_a
=> ["a", "b", "c", 0, 1, 2]

我该怎么做?

4

3 回答 3

3
a.flat_map do |string_range| 
  from, to = string_range.split("..", 2)
  (from =~ /^\d+$/ ? (from.to_i..to.to_i) : (from..to)).to_a 
end 
#=> => ["a", "b", "c", 0, 1, 2]
于 2012-11-01T21:22:37.750 回答
2
a = ["a..c", "0..2"]
b = a.flat_map{|str| Range.new(*str.split('..')).to_a} # => ["a", "b", "c", "0", "1", "2"]
p b.map!{|v| Integer(v) rescue v} # => ["a", "b", "c", 0, 1, 2]
于 2012-11-01T21:36:11.153 回答
2

那这个呢?

a = ["a..c", "0..2"]

b = a.map { |e| Range.new( *(e).split('..') ).to_a }.flatten

没有flat_map使用,所以它在所有版本上都一样

正如@steenslag 正确提到的那样,此版本不会转换为整数。

这是一个版本:

b = a.map do |e| 
  Range.new( *(e).split('..').map{ |c| c =~ /\A\d+\Z/ ? c.to_i : c } ).to_a 
end.flatten

在这里看到它的作用

于 2012-11-01T22:12:20.293 回答