【发布时间】:2011-08-18 05:36:03
【问题描述】:
我有以下数组
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
我想从数组中删除空白元素并希望得到以下结果:
cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
有没有像compact 这样没有循环的方法?
【问题讨论】:
我有以下数组
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
我想从数组中删除空白元素并希望得到以下结果:
cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
有没有像compact 这样没有循环的方法?
【问题讨论】:
在拒绝和拒绝中更新!
注意:我可以通过
ruby-3.0.1在irb 控制台 上检查这些方法。我还检查了 ruby 文档,但那里没有提到。我不确定这是哪个 ruby 版本 变化就在那里。社区的任何帮助都非常感谢。
对于ruby-3.0.1,我们可以使用reject 或reject!
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
或简写
cities.reject(&:empty?)
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
无论我们是否有空值,两者都会返回[]?
【讨论】:
要删除 nil 值,请执行以下操作:
['a', nil, 'b'].compact ## o/p => ["a", "b"]
删除空字符串:
['a', 'b', ''].select{ |a| !a.empty? } ## o/p => ["a", "b"]
删除 nil 和空字符串:
['a', nil, 'b', ''].select{ |a| a.present? } ## o/p => ["a", "b"]
【讨论】:
['a', nil, 'b', ''].select(&:present?) 简写
如果您使用Rails(或独立的ActiveSupport),从版本6.1 开始,有一个compact_blank 方法可以从数组中删除blank 值。
它在底层使用Object#blank? 来确定项目是否为空白。
["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"].compact_blank
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
[1, "", nil, 2, " ", [], {}, false, true].compact_blank
# => [1, 2, true]
这是link to the docs 和link to the relative PR。
还提供破坏性变体。见Array#compact_blank!。
如果您只需要删除 nil 值,
请考虑使用 Ruby 内置的 Array#compact 和 Array#compact! 方法。
["a", nil, "b", nil, "c", nil].compact
# => ["a", "b", "c"]
【讨论】:
纯红宝石:
values = [1,2,3, " ", "", "", nil] - ["", " ", nil]
puts values # [1,2,3]
【讨论】:
另一种方法:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
【讨论】:
使用 join 和 split 严格更新
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
结果将是:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
请注意:这不适用于有空格的城市
【讨论】:
这对我有用:
[1, "", 2, "hello", nil].reject(&:blank?)
输出:
[1, 2, "hello"]
【讨论】:
:blank? 是特定于 Rails 时遇到的麻烦。
NoMethodError: undefined method empty? for nil:NilClass,:blank? 优于:empty?
:blank 比 :empty 效果更好。因为:empty 不适用于nil
最短路径cities.select(&:present?)
【讨论】:
cities.delete_if(&:blank?)
这将删除 nil 值和空字符串 ("") 值。
例如:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
【讨论】:
有很多方法可以做到这一点,一种是reject
noEmptyCities = cities.reject { |c| c.empty? }
您也可以使用reject!,它将修改cities。如果它拒绝了某些东西,它将返回 cities 作为其返回值,如果没有拒绝,它将返回 nil。如果您不小心,这可能是一个陷阱(感谢 ninja08 在 cmets 中指出这一点)。
【讨论】:
cities.reject!(&:empty?)
cities.reject!(&:blank?)? empty? 用于数组
blank? 只能通过 ActiveSupport 获得。标准 Ruby 确实使用 String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
reject 优于 reject! 因为[].reject!(&:empty?) 返回nil,[].reject(&:empty?) 返回[]
这是实现这一目标的另一种方法
我们可以使用presence 和select
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
【讨论】:
" " 元素没有被拒绝方法删除。您的方法删除了 nil "" 或 " " 项。
在我的项目中,我使用delete:
cities.delete("")
【讨论】:
已经有很多答案了,但如果您在 Rails 世界中,这里有另一种方法:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
【讨论】:
present? 来自ActiveSupport。这没有 Rails 标记,并且为一种方法需要额外的 gem 似乎过分了。
你可以试试这个
cities.reject!(&:empty?)
【讨论】:
cities.reject!(&:blank?)
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
【讨论】:
blank? 是一个不错的选择,但它是一个rails 方法,这个问题是关于普通的ruby
如果您的数组中有混合类型,这是一个解决方案:
[nil,"some string here","",4,3,2]
解决方案:
[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}
输出:
=> ["some string here", 4, 3, 2]
【讨论】:
cities.reject! { |c| c.blank? }
您要使用blank? 而不是empty? 的原因是blank 可以识别nil、空字符串和空格。例如:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
仍会返回:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
在" " 上调用empty? 将返回false,您可能希望成为true。
注意:blank? 只能通过 Rails 访问,Ruby 仅支持 empty?。
【讨论】:
使用reject:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
【讨论】:
reject(&:empty?)。
nil.empty? 繁荣!
reject(&:empty?) 前面加上 compact,例如[nil, ''].compact.reject(&:empty?)
当我想整理这样的数组时,我会使用:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
这将删除所有空白或 nil 元素。
【讨论】:
试试这个:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
【讨论】:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? }
【讨论】: