row_data = [ "", "hi", "", nil ] # => ["", "hi", "", nil]
row_data.pop while !row_data.empty? && (!row_data.last || row_data.last.empty?) # => nil
row_data # => ["", "hi"]
与您的解决方案非常相似,但我们从 while 切换到 unless cause,而不是寻找我们正在寻找的对象的 PRESENCE nil 明确。然后我们检查该字符串是否为空。如果您希望数组中存在其他对象类型,则可以检查最后一个元素是否具有 empty? 方法。 (但我假设您正在解析 CSV,所以这很可能是一个有争议的问题)
如果您有 active_support 或在 rails 内,这会变得更容易。
# 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"]
Below 将从数组的任何位置删除 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"]