【问题标题】:How do I strip off nil elements from the end of an array if all my elements are nil?如果我的所有元素都是 nil,如何从数组末尾删除 nil 元素?
【发布时间】:2017-06-29 07:03:25
【问题描述】:

我使用的是 Ruby 2.4。我想从数组末尾剥离nil 元素,所以我正在使用

row_data.pop until row_data.last

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

【问题讨论】:

  • 对于一个空数组,row_data.last 的计算结果是什么?如何检测空数组?相应地更新逻辑条件。
  • 当你说“相应地更新逻辑条件”时,我该怎么做?
  • .. until updated_logic_condition_that_will_be_true_when_element_is_falsey_or_array_is_empty(此外,显示的原始条件也将排除 false 值)。

标签: arrays ruby null trim


【解决方案1】:

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

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

【讨论】:

  • 非常好。写row_data.pop while row_data.any? && row_data.last.nil? 可能会更好读。此外,这不会返回修改后的 row_data,因此如果将其包装在方法中,则需要另一行 row_data
【解决方案2】:

您可以使用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] : [])

【讨论】:

    【解决方案3】:

    试试这个

    最易读

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

    最高效

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

    【讨论】:

      【解决方案4】:

      如果要删除所有nils,试试这个:

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

      Map and Remove nil values in Ruby

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        相关资源
        最近更新 更多