我是Ruby的新手并坚持这个问题。假设我有一个这样的数组:
arr = [1, 2, 's', nil, '', 'd']
我想从中删除nil和空字符串,即最终数组应为:
arr = [1, 2, 's', 'd']
我试过了compact
,但它给出了这个:
arr.compact!
arr #=> [1, 2, 's', '', 'd'] doesn't remove empty string.
我想知道在Ruby中是否有一种聪明的方法。
答案 0 :(得分:36)
你可以这样做:
arr.reject { |e| e.to_s.empty? } #=> [1, 2, "s", "d"]
注意nil.to_s => ''
。
如果arr
可能包含您希望保留的其他类型的空对象(例如数组或哈希),请将e.to_s.empty?
更改为e.to_s == ''
答案 1 :(得分:23)
由于您要删除nil
和空字符串,因此它不是How do I remove blank elements from an array?的重复
您想使用.reject
:
arr = [1, 2, 's', nil, '', 'd']
arr.reject { |item| item.nil? || item == '' }
注意: reject
有和没有爆炸的行为方式与compact
有无爆炸的方式相同:reject!
和compact!
修改数组当reject
和compact
返回数组的副本并使原始文本完好无损时。
如果您使用的是Rails,则还可以使用blank?
。它专门设计用于nil
,因此方法调用变为:
arr.reject { |item| item.blank? }
答案 2 :(得分:8)
我倾向于:
arr = [1, 2, 's', nil, '', 'd']
arr.reject(&:blank?)
返回:
=> [1, 2, "s", "d"]
答案 3 :(得分:2)
您可以使用带拒绝的契约
arr = [1, 2, 's', nil, '', 'd']
arr = [1, 2, 's', 'd']
arr = arr.compact.reject { |h| h == "" }
或
arr = arr.compact.delete_if { |h| h == "" }
答案 4 :(得分:2)
您还可以使用-
删除所有nil
和''
元素:
arr -= [nil, '']
#=> [1, 2, "s", "d"]
或compact
和reject
使用快捷方式(以防您不使用Rails,只能使用arr.reject(&:blank?)
):
arr = arr.compact.reject(&''.method(:==))
#=> [1, 2, "s", "d"]
答案 5 :(得分:1)
您可以使用compact和delete_if方法在Ruby中删除数组中的nil和空字符串
arr = [1, 2, 's', nil, '', 'd']
arr.compact!.delete_if{|arrVal| arrVal.class == String and arrVal.empty?}
=> [1, 2, "s", "d"]
答案 6 :(得分:0)
注意:我正在考虑数组中可能包含带空格的字符串。
你可以这样做:
arr = [1, 2, 's', nil, ' ', 'd']
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '') == '') }
#=> [1, 2, "s", "d"]
或:
arr.reject{|a| a.nil? || (a.to_s.gsub(' ', '').empty?) }
#=> [1, 2, "s", "d"]
或者如果您想更新arr
对象本身,那么:
arr.reject!{|a| a.nil? || (a.to_s.gsub(' ', '') == '') } # notice the ! mark, it'll update the object itself.
p arr #=> [1, 2, "s", "d"]
答案 7 :(得分:0)
试试这个:
[1, 2, "s", nil, "", "d"].compact.select{|i| !i.to_s.empty?}
答案 8 :(得分:0)
希望这适合您的情况:
arr = [1, 2, 's', nil, '', 'd']
arr.select{|x| x.to_s!="" }
答案 9 :(得分:0)
我可能会添加.strip
以消除潜在的空白头痛(假设它不是rails应用程序)。
array = [1, 2, "s", nil, " ", "d", "\n"]
array.reject!{|a| a.nil? || (a.to_s.strip.empty?) }
#=> [1, 2, "s", "d"]
答案 10 :(得分:0)
text.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
只需使用此功能,无需任何其他操作。
答案 11 :(得分:0)
最简单,最快捷的方法是:
arr = [1, 2, 's', nil, '', 'd'] - [nil,'']
==> arr = [1, 2, 's', 'd']
答案 12 :(得分:0)
如果您使用的是Rails
(或独立的ActiveSupport
),则从版本6.1
开始,有一种compact_blank
方法将从其中删除blank
值数组。
它使用引擎盖下的Object#blank?
来确定某项是否为空白。
[1, 2, 's', nil, '', 'd'].compact_blank
# => [1, 2, 's', 'd']
[1, "", nil, 2, " ", [], {}, false, true].compact_blank
# => [1, 2, true]
这里是link to the docs和link to the relative PR。
也提供破坏性的变体。参见Array#compact_blank!
。