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- reverse和drop_while.
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |