25

众所周知,从数组Array#compact中删除元素。nil

array.reject { |element| element.empty? }

将删除空元素,例如[](在 rails 中,您也可以#blank?删除空元素 nil元素)。

是否有删除空/空白元素的速记方法,例如Array#compact?还是使用Array#reject我最好的选择?

如果有的话,我还没有看到 的“空”等价物#compact。但也许我只是忽略了它。

4

4 回答 4

31

就在这里!

array.reject &:empty?

但是,正如Scarver2Hoang Le解释的那样,NoMethodError如果数组包含nil.


如果您使用的是RailsActive Support,您可以安全地编写:

array.reject &:blank?

由于所有对象都会响应 ,因此不会出现错误blank?包括nil.

还有另一种方法可以做到这一点,正如mu is too short所建议的那样:

array.select &:present?

它似乎present?是根据blank?所以两者都是合适的。

于 2013-06-20T02:58:32.413 回答
3

从 Rails 6.1.3.1 开始,您有compact_blank

array = ["", "a", nil]
array.compact_blank
#=> ["a"]

正如它在 上定义的那样Enumerable,您也可以在哈希上使用它。

于 2021-04-22T22:49:10.543 回答
0

到今天为止,Rails 6.1 现在支持compact_blank

文档

于 2021-05-26T21:04:48.703 回答
0

如果你在一个纯 ruby​​ 项目中,没有 Active Support(或 Rails),并且正在寻找一个不会在 nil 上失败的复制和粘贴解决方案。这将对您有所帮助。

['', nil, 'foobar'].reject { |i| i.nil? || i.empty? }

或者,如果您不关心在数组上循环两次

['', nil, 'foobar'].compact.reject(&:empty?)
于 2021-12-29T10:59:42.283 回答