我有一个数组:
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,"]
答案 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.inject([]) do |res, el|
tmp = []
el.each do |inner_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=='/'}}
这将有效..