使用斜杠将Ruby数组拆分为子数组

时间:2012-08-10 05:25:56

标签: ruby-on-rails ruby arrays

我有一个数组:

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,"]

4 个答案:

答案 0 :(得分:4)

以下是您的需求:

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

答案 1 :(得分:2)

它有点乱(因为肮脏的说这是一个令人讨厌的问题),并且可能不太灵活地改变,但是:

 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

答案 2 :(得分:1)

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

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

需要最终reject来摆脱最终"/"中的迷路空数组。

答案 3 :(得分:1)

尝试使用

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

这将有效..