我如何"修剪"我的字符串数组?

时间:2017-07-12 19:18:58

标签: arrays ruby trim

使用Ruby,我很好奇如果这些元素为空(nil或空字符串),如何删除字符串数组的前导元素和结束元素。如果我有一个

的数组
["", "a", "", "b", nil, ""]

我希望结果是

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

我找到了一种使用

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

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

3 个答案:

答案 0 :(得分:2)

这是一种笨重的解决方案,涉及测试第一个元素并使用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的字符串。如果您使用的是Ruby on Rails或正在使用ActiveSupport,您将可以访问.present?方法,这是一个更严格的测试,需要定义字符串并包含至少一个非空格字符。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

ndx = array.index { |e| !e.to_s.empty? }
array[ndx..array.rindex { |e| !e.to_s.empty? }] unless ndx.nil?
  #=> ["a", "", "b"]

如果e #=> nile.to_s #=> ''