从ruby中的数组中删除尾随的nil值

Ash*_*kar 11 ruby arrays ruby-on-rails

我有一个像这样的数组:

[["a", nil, nil, nil], ["b", nil, "c", nil], [nil, nil, nil, nil]]
Run Code Online (Sandbox Code Playgroud)

我想从ruby中的数组中删除所有尾随的nil值.

我试过arr.map {|x| x.pop until x.last}但这个方法的问题是,当给定数组中的第3个数组中的数组的所有值都为零时,循环卡住了.

由于until x.last条件,如果所有的值都是nil那么map函数应该返回一个空数组?

应该是什么条件.

输出应该是

[['a'],['b','nil','c'],[]]
Run Code Online (Sandbox Code Playgroud)

请记住,我只想删除nil不在之间的尾随值.

Fir*_*cer 12

为此,您可以忘记外部数组并仅为内部数组解决它,然后使用map将解决方案应用于所有这些数组.

drop_while将返回一个新数组,而不包含满足某些条件的所有前导项(例如nil?).你想跟踪但是如此结合reverse.

[nil,nil,5,nil,6,nil].reverse.drop_while(&:nil?).reverse
[nil, nil, 5, nil, 6]
Run Code Online (Sandbox Code Playgroud)

然后使用map来表示所有数组.

arr = [["a", nil, nil, nil], ["b", nil, "c", nil], [nil, nil, nil, nil]]
arr.map{|a| a.reverse.drop_while(&:nil?).reverse}
[["a"], ["b", nil, "c"], []]
Run Code Online (Sandbox Code Playgroud)

如果你确实希望剩余nil的实际上是一个字符串,你可以将它与另一个执行你喜欢的转换的地图结合起来.


Ily*_*lya 10

你是在正确的方式,但只是修改你的代码:

array.each { |e| e.pop until !e.last.nil? || e.empty? }
#=> [["a"], ["b", nil, "c"], []]
Run Code Online (Sandbox Code Playgroud)

它比使用更快reverse- reversedrop_while.