【问题标题】:How do I remove blank elements from an array?如何从数组中删除空白元素?
【发布时间】:2011-08-18 05:36:03
【问题描述】:

我有以下数组

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]

我想从数组中删除空白元素并希望得到以下结果:

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

有没有像compact 这样没有循环的方法?

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    在拒绝和拒绝中更新!

    注意:我可以通过ruby-3.0.1irb 控制台 上检查这些方法。我还检查了 ruby​​ 文档,但那里没有提到。我不确定这是哪个 ruby​​ 版本 变化就在那里。社区的任何帮助都非常感谢。

    对于ruby-3.0.1,我们可以使用rejectreject!

    cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
    cities.reject{ |e| e.empty? }
    => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
    

    或简写

    cities.reject(&:empty?)
    => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
    

    无论我们是否有空值,两者都会返回[]

    【讨论】:

      【解决方案2】:

      要删除 nil 值,请执行以下操作:

       ['a', nil, 'b'].compact  ## o/p =>  ["a", "b"]
      

      删除空字符串:

         ['a', 'b', ''].select{ |a| !a.empty? } ## o/p => ["a", "b"]
      

      删除 nil 和空字符串:

      ['a', nil, 'b', ''].select{ |a| a.present? }  ## o/p => ["a", "b"]
      

      【讨论】:

      • ['a', nil, 'b', ''].select(&:present?) 简写
      【解决方案3】:

      compact_blank (Rails 6.1+)

      如果您使用Rails(或独立的ActiveSupport),从版本6.1 开始,有一个compact_blank 方法可以从数组中删除blank 值。

      它在底层使用Object#blank? 来确定项目是否为空白。

      ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"].compact_blank
      # => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
      
      [1, "", nil, 2, " ", [], {}, false, true].compact_blank
      # => [1, 2, true]
      

      这是link to the docslink to the relative PR

      还提供破坏性变体。见Array#compact_blank!


      如果您只需要删除 nil 值,

      请考虑使用 Ruby 内置的 Array#compactArray#compact! 方法。

      ["a", nil, "b", nil, "c", nil].compact
      # => ["a", "b", "c"]
      

      【讨论】:

        【解决方案4】:

        纯红宝石:

        values = [1,2,3, " ", "", "", nil] - ["", " ", nil]
        puts values # [1,2,3]
        

        【讨论】:

          【解决方案5】:

          另一种方法:

          > ["a","b","c","","","f","g"].keep_if{|some| some.present?}
          => ["a","b","c","f","g"]
          

          【讨论】:

            【解决方案6】:

            使用 joinsplit 严格更新

            cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
            cities.join(' ').split
            

            结果将是:

            ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
            

            请注意:这不适用于有空格的城市

            【讨论】:

            • 看起来很冒险!
            • 如果你有像“纽约”或“Naujoji Akmene”这样的城市,这肯定会失败:)
            【解决方案7】:

            这对我有用:

            [1, "", 2, "hello", nil].reject(&:blank?)
            

            输出:

            [1, 2, "hello"]
            

            【讨论】:

            • 在 Ruby 2.3.1 上我得到 NoMethodError: "undefined method `blank?' for 1:Fixnum" 试图执行此操作。
            • @Tom 空白?是特定于 Rails 的方法。 Array 上不存在纯红宝石。你将不得不使用空?或编写自己的方法。
            • @jpgeek 感谢您的澄清,这是我在意识到 :blank? 是特定于 Rails 时遇到的麻烦。
            • 因为NoMethodError: undefined method empty? for nil:NilClass:blank? 优于:empty?
            • :blank:empty 效果更好。因为:empty 不适用于nil
            【解决方案8】:

            最短路径cities.select(&:present?)

            【讨论】:

              【解决方案9】:

              最显式

              cities.delete_if(&:blank?)
              

              这将删除 nil 值和空字符串 ("") 值。

              例如:

              cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
              
              cities.delete_if(&:blank?)
              # => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
              

              【讨论】:

              • 删除标点符号并添加冒号给出“城市:如果为空则删除”:D
              • blank 是 ruby​​ 还是 rails 方法?
              • @ArnoldRoa 这是一个 Rails 方法。
              • 空字符串之间有空格怎么办?
              • @StevenAguilar 空格被视为长度 1(因为空格是字符)。 “ “。空白的? => 错误
              【解决方案10】:

              有很多方法可以做到这一点,一种是reject

              noEmptyCities = cities.reject { |c| c.empty? }
              

              您也可以使用reject!,它将修改cities。如果它拒绝了某些东西,它将返回 cities 作为其返回值,如果没有拒绝,它将返回 nil。如果您不小心,这可能是一个陷阱(感谢 ninja08 在 cmets 中指出这一点)。

              【讨论】:

              • 或者如果你喜欢更紧凑的cities.reject!(&:empty?)
              • 嗯,为什么不cities.reject!(&:blank?)empty? 用于数组
              • @Nico blank? 只能通过 ActiveSupport 获得。标准 Ruby 确实使用 String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
              • reject 优于 reject! 因为[].reject!(&:empty?) 返回nil[].reject(&:empty?) 返回[]
              • 小心拒绝!。拒绝!如果没有对数组进行任何更改,将返回 nil。如果您想在未进行任何更改时返回数组,只需使用不带 bang 的拒绝即可。
              【解决方案11】:

              这是实现这一目标的另一种方法

              我们可以使用presenceselect

              cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
              
              cities.select(&:presence)
              
              ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
              

              【讨论】:

              • 谢谢你。我的数组中有一些 " " 元素没有被拒绝方法删除。您的方法删除了 nil """ " 项。
              【解决方案12】:

              在我的项目中,我使用delete:

              cities.delete("")
              

              【讨论】:

              • 优雅!不幸的是没有返回剩余的数组,但是很漂亮
              • Array.delete 是违反直觉的。如果存在这样的方法,它的操作就像 .delete!() 一样。 .delete() 以破坏性方式直接对数组进行操作。
              【解决方案13】:

              已经有很多答案了,但如果您在 Rails 世界中,这里有另一种方法:

               cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
              

              【讨论】:

              • present? 来自ActiveSupport。这没有 Rails 标记,并且为一种方法需要额外的 gem 似乎过分了。
              • @Naveed,你应该在前面加上“如果你正在使用 RoR”。我不会对它投反对票,因为它对初学者来说仍然是有用的信息。
              【解决方案14】:

              你可以试试这个

               cities.reject!(&:empty?)
              

              【讨论】:

              • 也许你的意思是cities.reject!(&:blank?)
              【解决方案15】:
              1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
              
              => ["A", "B", "C"]
              

              【讨论】:

              • 我更喜欢使用 .reject(&:blank?) 来避免 nil 值
              • @RanGalili blank? 是一个不错的选择,但它是一个rails 方法,这个问题是关于普通的ruby
              【解决方案16】:

              如果您的数组中有混合类型,这是一个解决方案:

              [nil,"some string here","",4,3,2]
              

              解决方案:

              [nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}
              

              输出:

              => ["some string here", 4, 3, 2]
              

              【讨论】:

                【解决方案17】:
                cities.reject! { |c| c.blank? }
                

                您要使用blank? 而不是empty? 的原因是blank 可以识别nil、空字符串和空格。例如:

                cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
                

                仍会返回:

                ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
                

                " " 上调用empty? 将返回false,您可能希望成为true

                注意:blank? 只能通过 Rails 访问,Ruby 仅支持 empty?

                【讨论】:

                  【解决方案18】:

                  使用reject:

                  >> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
                  => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
                  

                  【讨论】:

                  • 或者,如上所述,reject(&:empty?)
                  • Symbol to proc 在 1.8.7 中比块格式慢。它与我在 1.9.2 中看到的一样
                  • 这很好,因为它会删除任何匹配 Object#empty? 的元素,例如。 “\n”、“”、nil、“\n\n\n”等...
                  • nil.empty? 繁荣!
                  • @AllenMaxwell @Naveed 如果您的数组包含 nil 元素,请在 reject(&:empty?) 前面加上 compact,例如[nil, ''].compact.reject(&:empty?)
                  【解决方案19】:

                  当我想整理这样的数组时,我会使用:

                  ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
                  

                  这将删除所有空白或 nil 元素。

                  【讨论】:

                  • 实际上,铁皮人的答案更好,因为它还会删除任何匹配 Object#blank?即 nil、“”、“\n”、“”、“\n\r”等。与公认的答案不同,它也可以在没有 Rails 的情况下工作。
                  【解决方案20】:

                  试试这个:

                  puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
                  

                  【讨论】:

                  • 这很漂亮,而且不返回“”!这是一个很棒的小技巧。
                  • ["Kathmandu", "Pokhara", " ", "Dharan", "Butwal"] - [""] - 在这种情况下不起作用
                  • 2.0.0-p247 :001 > [“加德满都”,“博卡拉”,“”,“Dharan”,“Butwal”] - [“”] => [“加德满都”,“博卡拉", "Dharan", "Butwal"] 似乎对我有用。为什么你认为它不起作用?
                  • @Raels,本例中的空白字符串不为空。它里面有一个空格。
                  • @Chandranshu 我不同意。我将文本复制并粘贴到编辑器中,发现引号之间没有您建议的空格。如果有,那么减去 ["", " "] 就可以了。 superluminary 的例子是类似的,也同样有效。最初的请求是删除“空白元素”而不是“空白元素”,示例空白元素在 OP 中显示为“”。
                  【解决方案21】:
                   cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 
                  

                  【讨论】:

                  • 删除和整理将是一项昂贵的操作
                  猜你喜欢
                  • 2019-11-28
                  • 1970-01-01
                  • 2019-08-23
                  • 2018-08-06
                  • 2013-01-26
                  • 1970-01-01
                  • 2022-11-16
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多