众所周知,从数组Array#compact
中删除元素。nil
array.reject { |element| element.empty? }
将删除空元素,例如[]
(在 rails 中,您也可以#blank?
删除空元素和 nil
元素)。
是否有删除空/空白元素的速记方法,例如Array#compact
?还是使用Array#reject
我最好的选择?
如果有的话,我还没有看到 的“空”等价物#compact
。但也许我只是忽略了它。
众所周知,从数组Array#compact
中删除元素。nil
array.reject { |element| element.empty? }
将删除空元素,例如[]
(在 rails 中,您也可以#blank?
删除空元素和 nil
元素)。
是否有删除空/空白元素的速记方法,例如Array#compact
?还是使用Array#reject
我最好的选择?
如果有的话,我还没有看到 的“空”等价物#compact
。但也许我只是忽略了它。
就在这里!
array.reject &:empty?
但是,正如Scarver2和Hoang Le解释的那样,NoMethodError
如果数组包含nil
.
如果您使用的是Rails或Active Support,您可以安全地编写:
array.reject &:blank?
由于所有对象都会响应 ,因此不会出现错误blank?
,包括nil
.
还有另一种方法可以做到这一点,正如mu is too short所建议的那样:
array.select &:present?
它似乎present?
是根据blank?
所以两者都是合适的。
从 Rails 6.1.3.1 开始,您有compact_blank
:
array = ["", "a", nil]
array.compact_blank
#=> ["a"]
正如它在 上定义的那样Enumerable
,您也可以在哈希上使用它。
到今天为止,Rails 6.1 现在支持compact_blank
如果你在一个纯 ruby 项目中,没有 Active Support(或 Rails),并且正在寻找一个不会在 nil 上失败的复制和粘贴解决方案。这将对您有所帮助。
['', nil, 'foobar'].reject { |i| i.nil? || i.empty? }
或者,如果您不关心在数组上循环两次
['', nil, 'foobar'].compact.reject(&:empty?)