如果我的所有元素都是零,如何从数组末尾剥离nil元素?

时间:2017-02-10 20:00:30

标签: arrays ruby null trim

我使用的是Ruby 2.4。我想从数组末尾删除nil元素,所以我使用

row_data.pop until row_data.last

但是如果数组只包含nil元素,这似乎会导致某种无限循环,因为调用永远不会返回。我如何解释数组可能包含所有nil元素的事实?

4 个答案:

答案 0 :(得分:3)

只需添加额外的检查以查看数组是否为空。

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

答案 1 :(得分:1)

您可以使用Array#rindex获取最右边的非零条目(或确定数组中的每个元素都是nil)。

def kill_nils_at_end(arr)
  ndx = arr.rindex(&:itself)
  ndx ? arr[0..ndx] : []
end

kill_nils_at_end [1,nil,1,nil,nil,nil]
  #=> [1, nil, 1]
kill_nils_at_end [nil,nil,nil,nil,nil,nil]
  #=> []

这不会改变原始数组。如果要修改阵列,请将倒数第二行更改为

arr.replace(ndx ? arr[0..ndx] : [])

答案 2 :(得分:1)

试试这个

最具可读性

arr = arr.reverse.drop_while(&:nil?).reverse

效率最高

arr.slice!(0..arr.rindex { |each| nil != each }.to_i)

答案 3 :(得分:0)

如果要删除所有nil,请尝试以下操作:

[1, nil, 3, nil, nil].compact #= [1,3]

请参阅Map and Remove nil values in Ruby