我有以下数组
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
我想从数组中删除空元素,并希望得到以下结果:
cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
是否有类似于compact
的方法可以不使用循环来实现?
有许多方法可以做到这一点,其中之一是使用reject
noEmptyCities = cities.reject { |c| c.empty? }
您还可以使用reject!
,它将直接修改cities
。如果拒绝了某些内容,则会返回cities
作为其返回值,如果没有进行任何拒绝,则会返回nil
。如果您不小心使用,这可能会导致问题(感谢ninja08在评论中指出这一点)。
cities.reject!(&:empty?)
。这行代码的作用是从数组中删除所有空字符串,并修改原始数组。 - aNoblecities.reject!(&:blank?)
呢?empty?
是针对数组的。 - Nicoblank?
是只有在使用 ActiveSupport
时才能使用的。标准 Ruby 使用的是 String#empty?
: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F - Michael Kohlreject
жҜ”reject!
жӣҙеҘҪпјҢеӣ дёә [].reject!(&:empty?)
иҝ”еӣһ nil
, [].reject(&:empty?)
иҝ”еӣһ []
гҖӮ пјҲжіЁпјҡиҜҘеҸҘиҜқи§ЈйҮҠдәҶеңЁRubyзј–зЁӢиҜӯиЁҖдёӯпјҢе»әи®®дҪҝз”Ёreject
иҖҢдёҚжҳҜreject!
жқҘйҒҝе…ҚеҮәзҺ°жңӘйў„жңҹзҡ„nil
иҝ”еӣһеҖјгҖӮпјү - konyak1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
blank?
,但这是 rails
方法,而此问题涉及纯粹的 ruby
。 - Swaps以下是对我有效的方法:
[1, "", 2, "hello", nil].reject(&:blank?)
输出:
[1, 2, "hello"]
:blank?
是Rails特有的。 - TomNoMethodError: undefined method empty? for nil:NilClass
错误,因此使用 :blank?
比 :empty?
更好。 - Lane:blank
works better than :empty
. Because :empty
does not work for nil
- KBIIX如果您正在使用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]
还有一种破坏性变体可用。请参见Array#compact_blank!
。
如果您使用较旧版本的Rails
,请检查compact_blank
内部实现。
它并不是很复杂,可以通过回溯进行。
def compact_blank
reject(&:blank?)
end
如果您只需要删除nil
值,请考虑使用Ruby内置的Array#compact
和Array#compact!
方法。
["a", nil, "b", nil, "c", nil].compact
# => ["a", "b", "c"]
在我的项目中,我使用了delete
关键字:
cities.delete("")
当我想整理这样的数组时,我使用:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
这将删除所有空白或空值元素。
cities.delete_if(&:blank?)
这将同时删除nil
和空字符串(""
)的值。
例如:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
试试这个:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
使用reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?)
。 - mu is too shortnil.empty?
的意思是检查空值(nil)是否为空。如果尝试在空值上调用empty?
方法,会导致程序崩溃(boom),需要立即停止(break)。 - Naveedreject(&:empty?)
之前加上compact
,例如[nil,'' ] .compact.reject(&:empty?)
。 - scarver2cities.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?
。
compact_blank
方法,因此可能值得更新已接受的答案为@Marian13的答案。 - SRack