将 Ruby 数组拆分为带斜杠的子数组



我有一个数组:

a = [[676, "/"], [679, "/", 680, "/"], [4, "3.7", "111.55", "/"], [668, "/"], [681, "/", 682, "/"]]

想要有这样的输出:

a = [[676], [679], [680], [4, "3.7", "111.55"], [668], [681], [682]]

尝试过这样的事情:

a.flatten.join(",").split("/")

它给出了这样的东西:

["676,", ",679,", ",680,", ",4,3.7,111.55,", ",668,", ",681,", ",682,"]

以下是您需要的:

a.flatten.chunk { |x| x != '/' }.select(&:first).map(&:last)  
#=> [[676], [679], [680], [4, "3.7", "111.55"], [668], [681], [682]]

或者:

a.flatten.chunk { |x| x != '/' }.map { |bool, arr| arr if bool }.compact

这有点混乱(正如 smathy 所说,这是一个令人讨厌的问题),而且更改起来可能不是很灵活,但是:

 arr = [[676­, "/"],­ [679,­ "/", 680, "/"],­ [4, "3.7"­, "111.­55", "/"],­ [668,­ "/"],­ [681,­ "/", 682, "/"]]­
arr.i­nject([]) do |res,­ el|
  tmp = []
  el.ea­ch do |inne­r_el|
    if inner­_el == "/"
      res << tmp
      tmp = []
    else
      tmp << inner­_el
    end
  end
  res
end

原始数组似乎无关紧要,因此我们可以使用flatten来简化inject

a.flatten
 .inject([[]]) { |m, e| e == '/' ? m.push([]) : m.last.push(e); m }
 .reject(&:empty?)

需要最后的reject才能从最后的"/"中摆脱杂散的空数组。

尝试使用

a.map!{|x| x.reject{|x| x=='/'}}

这将起作用..

相关内容

  • 没有找到相关文章

最新更新