es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for 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:

    function zip() {
      const args = Array.prototype.slice.call(arguments);
      const maxLength = Math.max(...args.map(a => a.length));
    
      // Crea un arreglo de arreglos vacíos con la longitud del arreglo de entrada más largo
      const result = Array.apply(null, {length: maxLength}).map(() => []);
    
      // Itera a través de cada arreglo de entrada
      args.forEach(arr => {
        // Itera a través de cada elemento en el arreglo y agrégalo al arreglo de resultado correspondiente
        arr.forEach((val, i) => result[i].push(val));
      });
      return result;
    }
    
    const result = zip(['fred', 'barney'], [30, 40], [true, false]);
    console.log(result);
    

    Aquí, primero convertimos el objeto arguments en un arreglo utilizando Array.prototype.slice.call(arguments). Luego, utilizamos Math.max y map 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 utilizando Array.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 utilizamos forEach para iterar a través de cada elemento en el arreglo y agregarlo al arreglo de resultado correspondiente utilizando result[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.

Comments are closed.