【问题标题】:A more elegant way to reject array if it contains only empty strings如果数组仅包含空字符串,则它是一种更优雅的拒绝数组的方法
【发布时间】:2012-10-08 18:47:36
【问题描述】:

我必须对(行)数组的(行)数组进行排序。 (行)数组包含任意数量的字符串。如果(行)数组仅包含空字符串,我想将其从(行)数组中删除。

我目前正在这样做:

rows.each do |row|

  row.each_index do |i|

   if row[i].length > 0
    break 
   elsif i == row.count-1
    rows.delete(row)
   end

  end

end

但是有没有更优雅的方法呢?

【问题讨论】:

    标签: ruby arrays ruby-on-rails-3


    【解决方案1】:

    稍微简洁一点:

    rows.reject! { |row| row.all?(&:empty?) }
    

    【讨论】:

    • 调用方法时,&expression 的意思是“评估expression,在它返回的任何内容上调用to_proc,并使用to_proc 返回的值作为此方法调用的块”。 Symbol#to_proc 是这样工作的::method_name.to_proc 返回一个匿名函数,就像{ |x| x.method_name }
    • 所以当你传递一个看起来像{ |x| x.method }的块时,你总是可以将它压缩到&:method,它应该在参数列表中排在最后。
    • 对 & / to_proc 的进一步讨论在这里:stackoverflow.com/questions/1961030/…
    【解决方案2】:

    在迭代时修改数组虽然不是一个好主意 - 您可能会发现您的代码会跳过某些元素或做一些奇怪的事情。我愿意

    rows.reject! {|row| row.all? {|row_element| row_element.empty?}}
    

    如果块row_element.empty? 对行中的所有元素评估为真,我们拒绝该行。非常值得熟悉 Enumerable 中的所有方法,它们对于此类任务非常方便。

    【讨论】:

    • 用空白比较好?而不是空的?如果元素之一为零,则为空白?将返回 true,而为空?会出错
    • 非常感谢。为清楚起见,请编辑您的答案以表明这将返回一个新数组,因为您使用了拒绝而不是拒绝,所以行保持不变!你这样做是因为使用了拒绝!会导致在迭代期间修改行吗?
    • +1 由于 OP 要求提供一个优雅的解决方案,并不是说你的不是,它完全没问题,考虑一下:rows.reject{ |row| row.all? &:empty? }
    • @iouri 空白?是一个railsism,虽然我想这个问题也被标记为rails。 1ndivisible - 没有意识到你有兴趣在原地做 - 这也有效
    • 其实我认为rows.reject!在这种情况下会很糟糕,因为“每次调用块时都会立即更改数组,而不是在迭代结束后”(ruby-doc.org/core-1.9.3/Array.html#method-i-reject)所以这相当于在迭代期间修改数组,就像我在做的那样。也许行 = rows.reject! { ... } 会更好吗?
    【解决方案3】:

    使用导轨时:

    ! rows.any?(&:present?)
    

    【讨论】:

      【解决方案4】:

      您可以使用compact.uniqcompact。如果你的数组有nil 值,compact 会产生一个空数组,所以你可以像这样检查:

      row.compact.size == 0
      

      如果行包含空字符串“”,您可以像这样检查它:

      row.compact.uniq.first.blank? and row.size == 1
      

      【讨论】:

        【解决方案5】:
            rows.select{|row| row.compact.count >0}
        

        【讨论】:

          【解决方案6】:

          这里:rows.all?(&:blank?)

          【讨论】:

          • 如果所有元素都为空,他只想拒绝数组。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-02
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 2014-10-30
          • 2018-05-05
          • 1970-01-01
          相关资源
          最近更新 更多