使用Ruby 2.4。我有一个带有字符串元素的数量的Arry。我想剥离从阵列的末端脱下零或空的elemetns,所以我有
row_data.pop until row_data.last || row_data.empty?
但这只是在数组末端剥离零元素。我如何调整上面的调整,以便它还包括空的元素?
row_data = [ "", "hi", "", nil ] # => ["", "hi", "", nil]
row_data.pop while !row_data.empty? && (!row_data.last || row_data.last.empty?) # => nil
row_data # => ["", "hi"]
与您的解决方案非常相似,但是我们会从时光倾斜到否则,除非原因而不是寻找对象的存在,否则我们正在显式寻找nil
。然后,我们检查该字符串是否为空。如果您希望在数组中存在其他对象类型,则可以检查最后一个元素是否具有方法empty?
。(但是我认为您正在解析CSV,所以很可能是一个毫无意义的点(
如果您有Active_support或在轨道内部,则会变得更容易。
# Ignore the require if in a rails project
require 'active_support/core_ext/object/blank' # => true
row_data = [ "", "hi", "", nil ] # => ["", "hi", "", nil]
row_data.pop while !row_data.empty? && row_data.last.blank? # => nil
row_data # => ["", "hi"]
下面将从数组的任何位置删除NIL或空字符串
row_data = [ "hi", "", nil ]
row_data.compact.reject(&:empty?) # => ["hi"]
给定一系列字符串,假设没有active_support
,这将删除任何零值compact
,然后拒绝任何为空reject(&:empty?)
的字符串,这确实会创建一个新的数组,并且不会进行任何更改。如果您需要突变原始对象,请使用以下代码
row_data = [ "hi", "", nil ]
row_data.compact!.reject!(&:empty?) # => ["hi"]
row_data # => ["hi"]
如果您有积极的支持,则可以降低
row_data = [ "hi", "", nil ]
row_data.reject(&:blank?) # => ["hi"]
如果数组仅包含字符串和 nil
s,则可以写入:
row_data = ["cat", nil, '', nil]
row_data.tap { |rd| pop while rd.last.to_s.empty? }
#=> ["cat"]
注意nil.to_s #=> ''
。
如果array
也可能包含其他对象,则可以写入:
row_data = ['', 1, :cat, {}, [], nil]
row_data.tap { |rd| rd.pop while (rd.last.nil? ||
(row_data.last.respond_to?(:empty?) && row_data.last.empty?)) }
#=> ["", 1, :cat]