23

我有一个数组:

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

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

puts scores.reject(&:empty?)

我收到一个错误:

undefined method `empty' for 1:Fixnum

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

4

9 回答 9

51

仅拒绝nil将是:

array.compact

于 2015-03-26T11:56:03.307 回答
20

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

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

"", " ", false, nil, [], 和{}为空白。

于 2013-10-17T15:09:04.530 回答
18

它很简单:

scores.grep(Integer)

请注意,如果您打算映射这些值,您可以在以下块中执行此操作:

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

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

scores.grep(/\d+/){|x|x.to_i}
于 2013-10-17T15:08:18.617 回答
2

尝试这个 :

scores.select{|e| e.is_a? Integer}
# => [1, 2, 3, 4]
于 2013-10-17T15:01:23.437 回答
2

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

scores.reject(&:nil?)
于 2014-11-24T00:49:27.097 回答
1
scores = [1, 2, 3, "", 4, nil]
scores.reject{|s| s.to_s == ''}
# => [1, 2, 3, 4]
于 2013-10-17T15:09:36.153 回答
1

这对我有用

scores.reject!{|x| x.to_s.empty?}
于 2014-05-05T06:39:32.830 回答
0

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

于 2013-10-17T15:25:56.787 回答
0
scores.select{|score| score.is_a? Fixnum}

或者,由于 Fixnum 从 Integer 继承,您也可以使用

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

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

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

于 2013-10-17T15:19:47.287 回答