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

时间:2014-09-30 06:41:51

标签: ruby arrays

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

arr = [1, 2, 's', nil, '', 'd']

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

arr = [1, 2, 's', 'd']

我试过了compact,但它给出了这个:

arr.compact!
arr #=> [1, 2, 's', '', 'd'] doesn't remove empty string.

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

13 个答案:

答案 0 :(得分:36)

你可以这样做:

arr.reject { |e| e.to_s.empty? } #=> [1, 2, "s", "d"]

注意nil.to_s => ''

如果arr可能包含您希望保留的其他类型的空对象(例如数组或哈希),请将e.to_s.empty?更改为e.to_s == ''

答案 1 :(得分:23)

由于您要删除nil和空字符串,因此它不是How do I remove blank elements from an array?的重复

您想使用.reject

arr = [1, 2, 's', nil, '', 'd']
arr.reject { |item| item.nil? || item == '' }

注意: reject有和没有爆炸的行为方式与compact有无爆炸的方式相同:reject!compact!修改数组当rejectcompact返回数组的副本并使原始文本完好无损时。

如果您使用的是Rails,则还可以使用blank?。它专门设计用于nil,因此方法调用变为:

arr.reject { |item| item.blank? }

答案 2 :(得分:8)

我倾向于:

arr = [1, 2, 's', nil, '', 'd']
arr.reject(&:blank?)

返回:

=> [1, 2, "s", "d"]

答案 3 :(得分:2)

您可以使用带拒绝的契约

arr = [1, 2, 's', nil, '', 'd']
arr = [1, 2, 's', 'd']

arr = arr.compact.reject { |h| h == "" }

arr = arr.compact.delete_if { |h| h == "" }

答案 4 :(得分:2)

您还可以使用-删除所有nil''元素:

arr -= [nil, '']
#=> [1, 2, "s", "d"]

Demonstration

compactreject使用快捷方式(以防您不使用Rails,只能使用arr.reject(&:blank?)

arr = arr.compact.reject(&''.method(:==))
#=> [1, 2, "s", "d"]

Demonstration

答案 5 :(得分:1)

您可以使用compact和delete_if方法在Ruby中删除数组中的nil和空字符串

arr = [1, 2, 's', nil, '', 'd']
arr.compact!.delete_if{|arrVal| arrVal.class == String and arrVal.empty?}
=> [1, 2, "s", "d"]

答案 6 :(得分:0)

注意:我正在考虑数组中可能包含带空格的字符串。

你可以这样做:

arr = [1, 2, 's', nil, ' ', 'd']
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '') == '') }
#=> [1, 2, "s", "d"]

或:

arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '').empty?) }
#=> [1, 2, "s", "d"]

或者如果您想更新arr对象本身,那么:

arr.reject!{|a| a.nil? || (a.to_s.gsub(' ', '') == '') } # notice the ! mark, it'll update the object itself.
p arr #=> [1, 2, "s", "d"]

答案 7 :(得分:0)

试试这个:

[1, 2, "s", nil, "", "d"].compact.select{|i| !i.to_s.empty?}

答案 8 :(得分:0)

希望这适合您的情况:

arr = [1, 2, 's', nil, '', 'd']
arr.select{|x| x.to_s!="" }

答案 9 :(得分:0)

我可能会添加.strip以消除潜在的空白头痛(假设它不是rails应用程序)。

array = [1, 2, "s", nil, "     ", "d", "\n"]
array.reject!{|a| a.nil? || (a.to_s.strip.empty?) }

#=> [1, 2, "s", "d"]

答案 10 :(得分:0)

text.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));

只需使用此功能,无需任何其他操作。

答案 11 :(得分:0)

最简单,最快捷的方法是:

arr = [1, 2, 's', nil, '', 'd'] - [nil,'']
==> arr = [1, 2, 's', 'd']

答案 12 :(得分:0)

compact_blank(Rails 6.1 +)

如果您使用的是Rails(或独立的ActiveSupport),则从版本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]

这里是link to the docslink to the relative PR

也提供破坏性的变体。参见Array#compact_blank!