我如何 "trim" 我的字符串数组?

How do I "trim" my array of strings?

对于 Ruby,我很好奇如果这些元素为空(nil 或空字符串),如何删除字符串数组的开头和结尾元素。如果我有一个数组

["", "a", "", "b", nil, ""]

我希望结果是

["a", "", "b"]

我找到了一种使用

删除数组中不存在的正确元素的部分方法
arr.pop until arr.last || arr.empty?

但这似乎只适用于修剪数组末尾的 nil 元素。它不解决空字符串或从数组前面删除空白元素。

这是一种笨拙的解决方案,涉及测试第一个元素并使用 shift 删除它,同时对最后一个元素执行相同操作 pop:

list = [nil, "", "a", "", "b", nil, "", nil]

while ((!list.first or !list.first.match(/\S/)) and list.any?)
  list.shift
end

while ((!list.last or !list.last.match(/\S/)) and list.any?)
  list.pop
end

list
# => ["a", "", "b"]

请记住,空字符串在 Ruby 中在逻辑上仍然为真,因为任何非字面上的 nilfalse 都将为真。如果您在 Rails 上的 Ruby 或正在使用 ActiveSupport,您将可以访问 .present? 方法,这是一个更严格的测试,要求定义字符串并至少包含一个非space字符。

array.
 drop_while { |element| element.nil? || element.empty? }.
 reverse.
 drop_while { |element| element.nil? || element.empty? }.
 reverse

如果要删除重复:

blank = ->(element) { element.nil? || element.empty? }

array.drop_while(&blank).reverse.drop_while(&blank).reverse

如果您使用的是主动支持,可以直接进行:

array.drop_while(&:blank?).reverse.drop_while(&:blank?).reverse
ndx = array.index { |e| !e.to_s.empty? }
array[ndx..array.rindex { |e| !e.to_s.empty? }] unless ndx.nil?
  #=> ["a", "", "b"]

如果e #=> nil,e.to_s #=> ''.