Tengo el siguiente código:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Quiero fusionar la matriz sen una matriz aque me daría:
["Cat", "and", "Dog", "&", "Mouse"]
Mirando a través de los documentos Ruby Array y Enumerable, no veo un método que logre esto.
¿Hay alguna forma de que pueda hacer esto sin iterar a través de cada matriz?

Respuestas:
Puedes hacer eso con:
fuente
atiene más de 3 elementos?[a, s].transposeexcepto que las dos filas no se ajustan, dejando#zipcomo solución obvia. Y no creo que quisiera decir que realmente le importaba siaestaba mutado ... No creo que estuviera comentando sobre una solución mutada frente a una solución funcional, solo estaba tratando de describir el patrón.Esto no dará una matriz de resultados en el orden que pidió Chris, pero si el orden de la matriz resultante no importa, puede usar
a |= b. Si no desea mutara, puede escribira | by asignar el resultado a una variable.Consulte la documentación de unión de conjuntos para la clase Array en http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Esta respuesta asume que no desea elementos de matriz duplicados. Si desea permitir elementos duplicados en su matriz final,
a += bdebería hacer el truco. Nuevamente, si no desea mutara, usea + by asigne el resultado a una variable.En respuesta a algunos de los comentarios de esta página, estas dos soluciones funcionarán con matrices de cualquier tamaño.
fuente
["Cat", "Dog", "Mouse", "and", "&"], que no es lo que quería el OP.Si no desea duplicar, ¿por qué no usar el operador de unión ?
fuente
sestarán al final de la nueva matriz.No le da el orden que pidió, pero es una buena forma de fusionar dos matrices agregando una.
fuente
Aquí hay una solución que permite intercalar múltiples matrices de diferentes tamaños (solución general):
fuente
No es exactamente elegante, pero funciona para matrices de cualquier tamaño:
fuente
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]que sería igualmente válido.andy&, por lo tanto, lo tomé lo más literalmente posible, mientras permitíaacualquier longitud.¿Qué tal una solución más general que funcione incluso si la primera matriz no es la más larga y acepta cualquier cantidad de matrices?
fuente
Para manejar la situación en la que ambos
a&sno son del mismo tamaño:.compacteliminaránilcuandoasea mayor ques| sagregará los elementos restantes descuandoasea menor quesfuente
Una forma de hacer la intercalación y también garantizar cuál es la matriz más grande para el método zip, es llenar una de las matrices con
nilel tamaño de la otra matriz. De esta manera, también garantiza qué elemento de qué matriz estará en la primera posición:fuente
preferred_arr.zip(other_arr).flatten | other_arr(sin el relleno nulo)fuente