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