Tengo un montón de matrices de diferentes longitudes que contienen objetos del mismo tipo. Lo que quiero es fusionar todas estas matrices en una matriz final. El problema que tengo es que los elementos deben alternarse en la matriz de resultados final.
entonces, si, por ejemplo, una matriz solo tiene un valor para alternar los resultados hasta que no haya ningún elemento en la matriz de longitud más corta y continuar con los demás que aún tienen valores.
const arr1 = [arr1Obj, arr1Obj, arr1Obj] const arr2 = [arr2Obj, arr2Obj, arr2Obj] const arr3 = [arr3obj] //no pre-defined amount of arrays, could be only one array or 10+ //output desired [arr1Obj, arr2Obj, arr3Obj, arr1Obj, arr2Obj, arr1Obj, arr2Obj]Mi enfoque fue simplemente usar un montón de bucles for anidados que estoy seguro de que no es la mejor manera de hacer esto. Me pregunto, ¿cómo se parecería la forma es6 más corta y de mayor rendimiento? Preferiblemente sin utilizar módulos como lodash.
Podemos usar Array.from() y Array.reduce() para obtener la secuencia que deseamos.
Comenzamos obteniendo la longitud máxima de la matriz usando Math.max() , luego usamos Array.from() para crear nuestra matriz de salida, usando Array.reduce() para agregar cada elemento a medida que iteramos sobre las matrices, aplanando al final :
const arr1 = ['arr1Obj', 'arr1Obj', 'arr1Obj'] const arr2 = ['arr2Obj', 'arr2Obj', 'arr2Obj'] const arr3 = ['arr3Obj'] // Sort our input by length, we want the longest array first... const arrays = [arr1, arr2, arr3]; const maxLength = Math.max(...arrays.map(a => a.length)); const result = Array.from({ length: maxLength }, (v, idx) => arrays.reduce((acc, arr) => { if (idx < arr.length) { acc.push(arr[idx]); } return acc; }, [])).flat(); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puede usar .reduce to n arrays con los j -ésimos elementos y luego .push todos sus elementos:
let arrs = [ [1,2,3], [2,undefined,'4',6,90,3.14], [1,0,-1,5], [], [100, 300, -Infinity] ]; let merged = []; for (var i = 0, j = 0; i < arrs.length; i++, j++) { merged.push(...arrs.reduce((a, c) => { if (c.length > j) a.push(c[j]); return a; }, [])); }