从数组中清除空字符串

13

我正在处理由字符串组成的一堆数组,很多时候我会写 .delete_if { |str| str.empty? }

我知道我可以自己将此方法添加到数组类中,但我希望有一种内置的方法可以在不向基类添加非标准方法的情况下完成。虽然将方法添加到基类很有趣,但出于可维护性的原因,我不想这样做。

是否有内置的方法来处理这个问题?


1
那么问题是什么? - fl00r
1
@fl00r 是否有内置的方法来实现它。 - sawa
3
好的,有compact!方法可以使用 :) - fl00r
1
仅仅向数组类添加一个新方法有什么问题吗? - user142019
1
只要在使用之前进行良好的文档记录并且对所有团队成员都很清晰,那么就没有任何问题了 :) - fl00r
显示剩余6条评论
9个回答

40

有一个简短的形式

array.delete_if(&:empty?)

2
如果你正在使用Rails,array.delete_if(&:blank?)是一个更好的选择,以避免NoMethodError,如果其中一个值为nil。 - jesal
2
array.compact.delete_if(&:empty?) 可以在纯 Ruby 中处理 nil 和空白。 - scarver2

8
您可以使用这种方法:
    1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
    => `["A", "B", "C"]`

请注意,如果您只需要清除数组中的nil值,则可以使用compact方法。

5

好的,有一个Array.delete方法。它返回被删除的内容(如果没有被删除则返回nil),但是这种方式感觉有些笨拙。不过它确实可以实现功能,并且不会因为非字符串元素而出错。

ar = ['a', '', 2, 3, '']
p ar.delete('')  #=> ""
p ar             #=> ["a", 2, 3]

我喜欢这个。几周前在SO上有关于删除元素并返回自身的方法的讨论,例如array.delete(element); array - fl00r

1

你可以做到这个

ar = ['a', '', 2, 3, '']
ar = ar.select{|a| a != ""}

我希望这对你有用。

0

如果你也想移除 nil:

arr = ['',"",nil,323]
arr.map!{|x|x==''?nil:x}.compact!

=> [323]

映射、三元运算符、紧凑


与其他方法不同,此行评估为返回的数组而不是已移除的内容。 - xxjjnn

0
从Rails 5.2开始,Enumerable现在支持.compact_blank,它正是你所要求的:
[1, "", nil, 2, " ", [], {}, false, true, 3].compact_blank
# =>  [1, 2, true, 3]

它也适用于哈希表,删除具有空白值的键值对。

文档:https://apidock.com/rails/Enumerable/compact_blank


0
你可以使用 .select! 但仍然会遇到同样的问题。
相反,你可以创建一个实用类来代替修改数组。

0
你可以尝试以下解决方案。希望能对你有所帮助。
array = ["", "", nil, nil, 2, 3] array.delete_if(&:blank?) => [2, 3]

0

对于简单的解决方法:

my_array = ['a', '', 2, 3, '']
compact_array = my_array.select(&:present?)
# => ["a", 2, 3]

这里:

我们只选择 Ruby 认为存在的数组项,而 nil"" 不被认为是存在的吗?在 Ruby 中。


.present? 是 Rails 的一个方法。 - John Coote
@JohnCoote,是的,更多细节请参见:https://api.rubyonrails.org/classes/Object.html#method-i-present-3F - Radin Reth
另一种解决方案:['a', '', 2, 3, ''] - [''] - Radin Reth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接