使用rails中的range来映射数组值

时间:2013-11-25 18:03:41

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我有以下代码

考虑这是作为输入的范围

ranges = ["1000-2000", "2001-5000", "5001-25000", "25001-0"]

def price_ranges ranges
    ranges.collect{|x| x.split('-')}.map { 
      |ar| 
        Range.new(Integer(ar.first), Integer(ar.second))  
          if Range.new(Integer(ar.first), Integer(ar.second)).eql?(25001..0)
            Range.new(Integer(ar.first), Float::INFINITY)
          end
    }
  end

我需要的实际输出是

[1000..2000, 2001..5000, 5001..25000, 25001..Infinity]

但我变得喜欢

[nil, nil, nil, 25001..Infinity]

如何修改上述代码

2 个答案:

答案 0 :(得分:0)

您可以在gsub数组的map内使用ranges

1.9.3p448 :008 > ranges = ["1000-2000", "2001-5000", "5001-25000", "25001-0"]
 => ["1000-2000", "2001-5000", "5001-25000", "25001-0"] 

1.9.3p448 :010 > ranges.map {|range| range.gsub(/-/, "..") }
 => ["1000..2000", "2001..5000", "5001..25000", "25001..0"] 

然后在你的循环中,你可以eval每个字符串:

1.9.3p448 :016 > eval(ranges.map {|range| range.gsub(/-/, "..") }.first)
 => 1000..2000 

1.9.3p448 :017 > _.class
 => Range 

请注意,对于您的上一个范围,如果您需要Infinity,则可以使用:

1.9.3p448 :012 > 1.0/0.0
 => Infinity 

答案 1 :(得分:0)

试试这个:

ranges = ["1000-2000", "2001-5000", "5001-25000", "25001-0"]

    def price_ranges ranges
        ranges.collect{|x| x.split('-')}.map { 
          |ar|
              range = Range.new(Integer(ar.first), Integer(ar.second)) 
              if range.eql?(25001..0)
                Range.new(Integer(ar.first), Float::INFINITY)
              else
                range
              end
        }
      end

对于数组的前3个元素,您将从nil评估中获得if