在Ruby中删除数组中的nil和空字符串

29 ruby arrays

我是Ruby的新手并坚持这个问题.假设我有一个这样的数组:

arr = [1, 2, 's', nil, '', 'd']
Run Code Online (Sandbox Code Playgroud)

我想从中删除nil和空字符串,即最终数组应该是:

arr = [1, 2, 's', 'd']
Run Code Online (Sandbox Code Playgroud)

我尝试了compact但它给出了这个:

arr.compact!
arr #=> [1, 2, 's', '', 'd'] doesn't remove empty string.
Run Code Online (Sandbox Code Playgroud)

我想知道在Ruby中是否有一种聪明的方法.

Car*_*and 38

你可以这样做:

arr.reject { |e| e.to_s.empty? } #=> [1, 2, "s", "d"]
Run Code Online (Sandbox Code Playgroud)

注意nil.to_s => ''.

如果arr可能包含您希望保留的另一种空对象(例如,数组或散列),请更改e.to_s.empty?e.to_s == ''

  • 对于那些首先看到这个答案的人:根据 /sf/answers/2926762261/,使用 `arr.reject(&:blank?)` 更简单 (4认同)
  • `:blank?` 只能在 Rails 中工作,因为它是一个 ActiveSupport 方法而不是 ruby​​ 的一部分。 (2认同)

awe*_*ndt 24

既然要删除nil空字符串和空字符串,那么它与如何从数组中删除空白元素并不重复

你想用.reject:

arr = [1, 2, 's', nil, '', 'd']
arr.reject { |item| item.nil? || item == '' }
Run Code Online (Sandbox Code Playgroud)

注意: reject使用和不使用bang的行为与使用和不使用bang的行为相同compact:reject!compact!修改数组本身,reject然后compact返回数组的副本并保持原始状态不变.

如果您正在使用Rails,您也可以使用blank?.它专门设计用于处理nil,因此方法调用变为:

arr.reject { |item| item.blank? }
Run Code Online (Sandbox Code Playgroud)

  • 这是我赞成的答案.我喜欢使用它的方式是`arr.reject&:blank?`. (6认同)
  • 整数不响应`empty?` (2认同)

Mar*_*n13 13

Compact_blank(Rails 6.1+)

如果您正在使用Rails(或独立的ActiveSupport),从 version 开始6.1,有一个compact_blank方法可以blank从数组中删除值。

Object#blank?在幕后用于确定项目是否为空白。

[1, 2, 's', nil, '', 'd'].compact_blank
# => [1, 2, 's', 'd']

[1, "", nil, 2, " ", [], {}, false, true].compact_blank
# => [1, 2, true]
Run Code Online (Sandbox Code Playgroud)

这是文档的链接相关 PR 的链接

还提供破坏性变体。看Array#compact_blank!


Jay*_*Jay 8

我倾向于这样做:

arr = [1, 2, 's', nil, '', 'd']
arr.reject(&:blank?)
Run Code Online (Sandbox Code Playgroud)

收益:

=> [1, 2, "s", "d"]
Run Code Online (Sandbox Code Playgroud)


Man*_*tam 7

arr.reject(&:blank?)

就用这个,不需要别的。

  • `blank` 不是 Ruby 方法,而是 Rails 方法,因此您应该添加 active_support 所需的库,并且问题已标记为 Ruby 而不是 Rails。无论如何,这个答案之前指出了一些问题。 (2认同)