Estoy intentando reagrupar una matriz de matrices usando reduce… y no lo estoy logrando.
Entonces, estoy tratando de agrupar los elementos… bueno, de una manera que es difícil de explicar. Aquí tienes un ejemplo de entrada y salida esperada…
zip(['fred', 'barney'], [30, 40], [true, false]);
debería producir…
→ [[‘fred’, 30, true], [‘barney’, 40, false]]
Pensé que reduce sería apropiado ya que se supone que debo tomar múltiples arrays y convertirlos en un solo array que contenga la misma cantidad de arrays que la longitud del array de entrada…
Aquí es en lo que estoy trabajando… No está funcionando pero creo que estoy cerca de la idea correcta!
function zip(array) {
return array.reduce((acc, next) => {
// obtener la longitud del siguiente array para usarla en el bucle for...
let numOfElem = next.length
// utilizar un bucle for para acceder a diferentes arrays indexados...
for (let i = 0; i < numOfElem; i++) {
// esto se supone que empujará el elemento apropiado en el siguiente array al índice correspondiente del array acumulador...
acc[i].push(next[i]);
}
return acc;
}, [])
}
const result = zip(['fred', 'barney'], [30, 40], [true, false]);
console.log(result);
Creo que estoy intentando hacer push incorrectamente. La idea detrás de acc[i].push(next[i])
es que acc[i]
creará la cantidad necesaria de arrays basándose en la longitud de los arrays de entrada. El código no funciona. ¡Solo estoy buscando una forma de hacerlo funcionar, incluso si es mediante un método diferente!
¡Gracias por tomarse el tiempo de leer esto y por cualquier comentario, consejo o truco!
davy.ai
Parece que estás siguiendo el camino correcto al utilizar
reduce
para fusionar múltiples arreglos en un solo arreglo. Aquí hay algunos ajustes que podrías hacer a tu código:Aquí, primero convertimos el objeto
arguments
en un arreglo utilizandoArray.prototype.slice.call(arguments)
. Luego, utilizamosMath.max
ymap
para obtener la longitud del arreglo de entrada más largo. Después de eso, creamos un arreglo de arreglos vacíos con la longitud del arreglo de entrada más largo utilizandoArray.apply(null, {length: maxLength}).map(() => [])
.Para fusionar los arreglos de entrada en un solo arreglo, utilizamos
forEach
para iterar a través de cada arreglo de entrada y nuevamente utilizamosforEach
para iterar a través de cada elemento en el arreglo y agregarlo al arreglo de resultado correspondiente utilizandoresult[i].push(val)
.Esto debería mostrar
[['fred', 30, true], ['barney', 40, false]]
, que es el resultado esperado.¡Espero que esto ayude! Hazme saber si tienes alguna pregunta.