如何从数组中删除空白元素?

ash*_*ai_ 271 ruby arrays

我有以下数组

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
Run Code Online (Sandbox Code Playgroud)

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

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*eer 482

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

noEmptyCities = cities.reject { |c| c.empty? }
Run Code Online (Sandbox Code Playgroud)

您也可以使用reject!,它将cities在适当的位置进行修改.cities如果它拒绝某些东西,或者nil如果没有拒绝,它将返回作为其返回值.如果你不小心,这可能是一个问题(感谢ninja08在评论中指出这一点).

  • 或者如果你更喜欢更紧凑的`cities.reject!(&:empty?)` (221认同)
  • 嗯,为什么不`cities.reject!(&:blank?)`?`empty?`用于数组 (53认同)
  • @Nico`black?`只能通过`ActiveSupport`获得.标准Ruby确实使用`String#empty?`:http://www.ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F (27认同)
  • `reject`胜过`reject!`因为`[] .reject!(&:empty?)`返回`nil`,`[] .reject(&:empty?)`返回`[]` (22认同)
  • 小心拒绝!拒绝!如果没有对数组进行任何更改,则返回nil.如果您想在没有进行任何更改时返回数组,只需使用不带爆炸的拒绝. (17认同)

小智 161

1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢使用.reject(&:blank?)来避免使用nil值 (5认同)
  • @RanGalili`blank?`是一个不错的选择,但它是一个`rails`方法,这个问题是关于普通的'红宝石' (4认同)

kim*_*een 76

这对我有用:

[1, "", 2, "hello", nil].reject(&:blank?)
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, "hello"]
Run Code Online (Sandbox Code Playgroud)

  • @汤姆空白?是 Rails 特定的方法。普通 ruby​​ 的数组中不存在。你将不得不使用空?或者编写自己的方法。 (2认同)

esi*_*sio 52

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

cities.delete("")
Run Code Online (Sandbox Code Playgroud)

  • Array.delete违反直觉.如果存在这样的方法,它就像.delete!()一样运行..delete()以破坏性方式直接在数组上运行. (11认同)
  • 优雅!遗憾的是,它不会返回剩余的数组,但非常漂亮 (5认同)

sup*_*ary 41

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

["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Run Code Online (Sandbox Code Playgroud)

这将删除所有空白或零元素.


phl*_*egx 23

最明确的

cities.delete_if(&:blank?)
Run Code Online (Sandbox Code Playgroud)

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

例如:

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

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Run Code Online (Sandbox Code Playgroud)

  • 空白是红宝石还是铁轨方法? (2认同)
  • @ArnoldRoa这是一个Rails方法. (2认同)

Rae*_*els 21

试试这个:

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Run Code Online (Sandbox Code Playgroud)

  • 这是光滑的,不会返回""!这是一个很棒的小技巧. (4认同)
  • ["Kathmandu", "Pokhara", " ", "Dharan", "Butwal"] - [""] - 在这种情况下不起作用 (2认同)

the*_*Man 17

用途reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Run Code Online (Sandbox Code Playgroud)

  • 或者,正如上面提到的aNoble,`拒绝(&:空?)`. (13认同)
  • `nil.empty?`booom break! (5认同)
  • 我使用这种形式,因为它也适用于1.8.7. (2认同)
  • @AllenMaxwell @Naveed 如果你的数组有 nil 元素,请在 `reject(&:empty?)` 前面加上 `compact`,例如 `[nil, ''].compact.reject(&:empty?)` (2认同)

Col*_*ent 14

cities.reject! { |c| c.blank? }
Run Code Online (Sandbox Code Playgroud)

你想使用的原因blank?empty?是空白识别零,空字符串,和空白.例如:

cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
Run Code Online (Sandbox Code Playgroud)

还会回来:

["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Run Code Online (Sandbox Code Playgroud)

并呼吁empty?" "将返回false,这你可能想true.

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


Mar*_*n13 13

compact_blank (Rails 6.1+)

如果您使用Rails(或独立ActiveSupport),从 version 开始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]
Run Code Online (Sandbox Code Playgroud)

这是文档链接和相关 PR链接

还可以使用破坏性变体。见Array#compact_blank!


如果您只需要删除nil值,

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

["a", nil, "b", nil, "c", nil].compact
# => ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)


vid*_*unj 11

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

 ['a', nil, 'b'].compact  ## o/p =>  ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

要删除空字符串:

   ['a', 'b', ''].select{ |a| !a.empty? } ## o/p => ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

要删除 nil 和空字符串:

['a', nil, 'b', ''].select{ |a| a.present? }  ## o/p => ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

  • `['a', nil, 'b', ''].select(&:present?)` 为速记 (5认同)

Nav*_*eed 10

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

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
Run Code Online (Sandbox Code Playgroud)

  • `present?`来自`ActiveSupport`.这有一个没有Rails标签,并且需要一个额外的宝石,一个方法似乎过多. (4认同)

Sam*_*dhe 9

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

我们可以使用presenceselect

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

cities.select(&:presence)

["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Run Code Online (Sandbox Code Playgroud)

  • 这次真是万分感谢.我的数组中有一些``"`元素没有用reject方法删除.你的方法删除了`nil``""或``"`items. (2认同)

Fra*_*ois 8

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

[nil,"some string here","",4,3,2]
Run Code Online (Sandbox Code Playgroud)

解:

[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}
Run Code Online (Sandbox Code Playgroud)

输出:

=> ["some string here", 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)


anu*_*sha 5

你可以试试看

 cities.reject!(&:empty?)
Run Code Online (Sandbox Code Playgroud)

  • 也许你的意思是`city.reject!(&:blank?)` (3认同)