Ruby使用.reject从数组中删除nil值

时间:2013-10-17 15:00:10

标签: ruby arrays

我有一个数组:

scores = [1, 2, 3, "", 4]

我想删除所有空白值。但是当我运行时:

puts scores.reject(&:empty?)

我收到错误:

undefined method `empty' for 1:Fixnum

如何在一步过程中从数组中删除非整数的值?我使用的是Ruby 1.9.3。

9 个答案:

答案 0 :(得分:43)

仅拒绝nil将是:

array.compact

答案 1 :(得分:20)

如果要删除空白值,则应使用blank? :(需要Rails / ActiveSupport)

scores.reject(&:blank?)
#=> [1, 2, 3, 4]

""" "falsenil[]{}为空。

答案 2 :(得分:18)

这很简单:

scores.grep(Integer)

请注意,如果您计划映射值,则可以在以下块中执行此操作:

scores.grep(Integer){|x| x+1 }

奖金如果你想做同样的事情,但你的数字是字符串:

scores.grep(/\d+/){|x|x.to_i}

答案 3 :(得分:2)

试试这个:

scores.select{|e| e.is_a? Integer}
# => [1, 2, 3, 4]

答案 4 :(得分:2)

如果你真的只需要拒绝nil,那么就可以这样做:

scores.reject(&:nil?)

答案 5 :(得分:1)

scores = [1, 2, 3, "", 4, nil]
scores.reject{|s| s.to_s == ''}
# => [1, 2, 3, 4]

答案 6 :(得分:1)

这为我工作

scores.reject!{|x| x.to_s.empty?}

答案 7 :(得分:0)

scores.select{|score| score.is_a? Fixnum}

或者,由于Fixnum继承自Integer,您也可以选择

scores.select{|score| score.is_a? Integer)

......如果这看起来更具描述性。

Array和Enumerable倾向于提供许多方法来做同样的事情。

答案 8 :(得分:0)

&:empty?适用于哈希,数组和字符串,但不适用于数字。您在拒绝中使用的方法必须对列表中的所有项有效。 &:blank?因此而工作正常。