我如何 "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 中在逻辑上仍然为真,因为任何非字面上的 nil
或 false
都将为真。如果您在 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 #=> ''
.
对于 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 中在逻辑上仍然为真,因为任何非字面上的 nil
或 false
都将为真。如果您在 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 #=> ''
.