如何从数组末尾剥离nil或空元素?

时间:2017-04-23 22:52:13

标签: arrays ruby null

使用Ruby 2.4。我有一个带有数字字符串元素的arry。我想从数组的末端剥离无数或空的elemet,所以我有

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

但这只是剥离了数组末尾的nil元素。如何调整上面的内容以便它还包含空元素?

2 个答案:

答案 0 :(得分:2)

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转换到除非导致而不是查找我们正在寻找nil的对象的PRESENCE。然后我们检查该字符串是否为空。如果您希望数组中存在其他对象类型,则可以检查最后一个元素是否具有方法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"]

下面会从数组的任意位置删除nil或空字符串

 row_data = [ "hi", "", nil ]
 row_data.compact.reject(&:empty?) # => ["hi"]

给定一个字符串数组,并假设没有active_support这将删除任何nil值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"]

答案 1 :(得分:1)

如果数组只包含字符串和df[rowSums(is.na(df))==3,]$A <- "NotImportant" df[with(df, is.na(A) & (!is.na(B) | !is.na(C))),]$A <- "Unknown" # A B C #1 NotImportant NA NA #2 Unknown 200 NA ,则可以写:

nil

注意row_data = ["cat", nil, '', nil] row_data.tap { |rd| pop while rd.last.to_s.empty? } #=> ["cat"]

如果nil.to_s #=> ''也可能包含其他对象,可以写一下:

array