【问题标题】:How do I strip off nil or empty elements from the end of my array?如何从数组末尾去除 nil 或空元素?
【发布时间】:2017-04-24 11:39:21
【问题描述】:

使用 Ruby 2.4。我有一个带有 numbegr 字符串元素的数组。我想从数组的末端去掉 nil 或空的元素,所以我有

row_data.pop until row_data.last || row_data.empty?

但这只是从数组末尾剥离 nil 元素。如何调整上述内容以使其也包含空元素?

【问题讨论】:

  • nil 是在整个数组中出现还是仅在最后?
  • 嗨,nils 可以在数组中的任何位置。
  • 如果您使用的是 Rails,blank? 是一种检查 nil 或空的方法,甚至适用于 nil。
  • while row_data.last.to_s.empty?; row_data.pop end

标签: arrays ruby null


【解决方案1】:
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"]

【讨论】:

  • 嗨,这些都不起作用。如果数组是 ["", "hi", "", nil ],第一个和第二个建议都会产生 ["hi"]。我不想从开头删除 nil/empty 元素,只删除数组的末尾。
  • @Natalia Ah 数组的“结束”,错过了。
  • @Natalia 解决方案已修改。
  • 嗨,非常感谢!不要挑剔,但我注意到如果数组为空,([]),您的解决方案似乎会导致某种无限循环。
  • @Natalia 固定,它会尝试永远弹出:) 在我们做任何事情之前检查数组是否有东西弹出。
【解决方案2】:

如果数组只包含字符串和nils,可以这样写:

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]

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多