我有以下代码:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Run Code Online (Sandbox Code Playgroud)
我想将数组合并s到数组中a,这将给我:
["Cat", "and", "Dog", "&", "Mouse"]
Run Code Online (Sandbox Code Playgroud)
浏览Ruby Array和Enumerable docs,我没有看到这样的方法.
有没有办法可以在不迭代每个数组的情况下做到这一点?
Dig*_*oss 168
你可以这样做:
a.zip(s).flatten.compact
Run Code Online (Sandbox Code Playgroud)
Mic*_*ker 32
这不会按照Chris要求的顺序给出结果数组,但如果结果数组的顺序无关紧要,您可以使用a |= b.如果您不想变异a,可以编写a | b并将结果分配给变量.
请参阅http://www.ruby-doc.org/core/classes/Array.html#M000275上的Array类的set union文档.
这个答案假定您不需要重复的数组元素.如果你想在你的最终数组中允许重复元素,那么a += b应该这样做.同样,如果您不想变异a,请使用a + b并将结果分配给变量.
针对此页面上的一些评论,这两个解决方案将适用于任何大小的数组.
Dou*_*las 28
如果您不想复制,为什么不使用union运算符:
new_array = a | s
Run Code Online (Sandbox Code Playgroud)
小智 6
s.inject(a, :<<)
s #=> ["and", "&"]
a #=> ["Cat", "Dog", "Mouse", "and", "&"]
Run Code Online (Sandbox Code Playgroud)
它没有给你你要求的顺序,但它是一个通过附加到一个来合并两个数组的好方法.
这是一个允许交错多个不同大小的数组的解决方案(通用解决方案):
arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
["and", "&"],
["hello", "there", "you"]]
first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]
Run Code Online (Sandbox Code Playgroud)
a处理&s大小不同的情况:
a.zip(s).flatten.compact | s
Run Code Online (Sandbox Code Playgroud)
.compactnil当a大于时将删除s | s将从小于时s添加剩余项目as它不是很优雅,但适用于任何大小的数组:
>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2]
#=> ["Cat", "and", "Dog", "&", "Mouse"]
Run Code Online (Sandbox Code Playgroud)