如何删除数组中的空字符串

时间:2013-09-27 00:53:01

标签: ruby arrays string

我想让delete_if从数组中删除空字符串。使用下面的解决方案,数组仍然包含许多空字符串。

products = my_text.split(/\t+/)
products.delete_if {|element| element == " " || "" || element.nil?}

有什么遗漏吗?

5 个答案:

答案 0 :(得分:9)

您的代码问题由Ed S.解释 否则,你可以做

products.reject! { |s| s.nil? || s.strip.empty? }

为什么需要先测试nil??我们来看几行。

nil.strip
# NoMethodError: undefined method `strip' for nil:NilClass
"   ".strip
# => ""

现在,使用不同的顺序,如果对象是字符串,代码会做什么,然后如果它是nil。

"  ".strip || "  ".nil?
# => ""
nil.strip || nil.nil?
# NoMethodError: undefined method `strip' for nil:NilClass
# Oh you don't want that to happen, do you?

这意味着当您的对象为strip.empty?时,您不想致电nil 如您所知,当您有a || b时,如果a是真实的(即不是nil也不是false),则永远不会调用b
如果字符串是nil,则先测试;如果是,您不需要检查正确的部分(因此您不会得到未定义的方法错误),并且该对象将从您的产品列表中删除。

答案 1 :(得分:2)

这是错的:

element == " " || "" || element.nil?

应该是

products = products.delete_if {|element| element == " " || element == "" || element.nil?

请注意,那里有|| "" ||。您没有将element""进行比较,您正在测试""的“真实性”(评估为true btw,搞砸了空字符串检查)。< / p>

这当然假设您对“空字符串”的定义为零," """

怎么样?
"  " 

甚至

"         "

答案 2 :(得分:1)

String#strip每个元素然后拒绝空元素:

arr.map!(&:strip).reject!{|s| s.empty?}

答案 3 :(得分:0)

我在这里可能排在最后(您6年前在哪里?),但这是我的建议,处理nil""" "

arr.compact.map(&:strip).reject(&:empty?)

例如: ["", nil, "toto", " "].compact.map(&:strip).reject(&:empty?)

# => ["toto"]

快乐的科维迪锁定!

答案 4 :(得分:0)

因此,如果您有一个字符串数组,可以使用reject函数轻松删除空值:

具有这样的字符串数组:

array = ["", "ABC", "DEF", ... , "", "ZXY"]

如果您使用reject

array.reject(&:empty?)

将输出干净的字符串数组:

=> ["ABC", "DEF", "ZXY"]