从Array中删除前导nils

Bor*_*nho 0 ruby

我有一个像这样的数组:

[nil, nil, nil, 2, 4, 6, 1, nil, nil, 3, 4, 6]
Run Code Online (Sandbox Code Playgroud)

我需要的是一个很好的方法来删除所有领先的 nils(所以compact!很糟糕),并删除nils的数量(所以drop_while是坏的).

Car*_*and 6

这有三种方法.请注意,以下内容经过了多次编辑.

arr0 = [nil, nil, nil, 2, 4, 6, 1, nil, nil, 3, 4, 6]
arr1 = [nil, nil]
arr2 = [1, 2]
Run Code Online (Sandbox Code Playgroud)

#1

def remove_leading_nils(arr)
  i = arr.index { |e| !e.nil? } || arr.size
  arr.slice!(0...i)
  i
end

remove_leading_nils(arr0) #=> 3
arr0                      #=> [2, 4, 6, 1, nil, nil, 3, 4, 6] 

remove_leading_nils(arr1) #=> 2
arr1                      #=> [] 

remove_leading_nils(arr2) #=> 0
arr2                      #=> [1,2] 
Run Code Online (Sandbox Code Playgroud)

#2

def remove_leading_nils(arr)
  arr.size.times.with_object([]) { |_,a| a << arr.shift unless arr.first }.size
end
Run Code Online (Sandbox Code Playgroud)

#3

我更喜欢这个,因为它更简单,我认为它最好:

def remove_leading_nils(arr)
  sz = arr.size
  arr.shift while !arr.empty? && arr.first.nil?
  sz - arr.size
end
Run Code Online (Sandbox Code Playgroud)

方法#2和#3具有相同的返回值arr0,arr1并且arr2一样的方法#1.