freeCodeCamp/guide/spanish/certifications/javascript-algorithms-and-d.../intermediate-algorithm-scri.../steamroller/index.md

7.5 KiB

title localeTitle
Steamroller Apisonadora

:triangular_flag_on_post: Recuerda usar Read-Search-Ask si te atascas. Tratar de emparejar el programa :busts_in_silhouette: y escribe tu propio código :pencil:

:checkered_flag: Explicación del problema:

Este problema parece simple, pero debe asegurarse de aplanar cualquier matriz, independientemente del nivel, lo que agrega un poco de dificultad al problema.

Enlaces relevantes

:speech_balloon: Sugerencia: 1

Es necesario comprobar si un elemento es una matriz o no.

intenta resolver el problema ahora

:speech_balloon: Sugerencia: 2

Si está tratando con una matriz, entonces necesita aplanarla obteniendo el valor dentro de la matriz. Esto significa que si tiene [4]], en lugar de devolver [4], debe devolver 4. Si obtiene [[[4]] entonces lo mismo, quiere el 4. Puede acceder a él con arr [index1] [index2] para ir un nivel más profundo.

intenta resolver el problema ahora

! [: speech_balloon: Pista: 3

Definitivamente necesitará recursión u otra forma de ir más allá de las matrices de dos niveles para hacer que el código sea flexible y no esté rígido para las respuestas necesarias. ¡Que te diviertas!

intenta resolver el problema ahora

¡Alerta de spoiler!

señal de advertencia

¡Solución por delante!

:beginner: Solución de código básico:

function steamrollArray(arr) { 
  var flattenedArray = []; 
 
  // Create function that adds an element if it is not an array. 
  // If it is an array, then loops through it and uses recursion on that array. 
  var flatten = function(arg) { 
    if (!Array.isArray(arg)) { 
      flattenedArray.push(arg); 
    } else { 
      for (var a in arg) { 
        flatten(arg[a]); 
      } 
    } 
  }; 
 
  // Call the function for each element in the array 
  arr.forEach(flatten); 
  return flattenedArray; 
 } 
 
 // test here 
 steamrollArray([1, [2], [3, [[4]]]]); 

:rocket: Ejecutar código

Explicación del código:

  • Crea una nueva variable para mantener los arreglos aplanados.
  • Cree una función que agregue elementos que no sean de matriz a la nueva variable, y para los que están en matriz, los recorre para obtener el elemento.
  • Lo hace mediante el uso de recursión, si el elemento es una matriz, vuelva a llamar a la función con una capa de matriz más profunda para verificar si es una matriz o no. si no es así, presione ese elemento no de matriz en la variable que se devuelve. De lo contrario, sigue profundizando.
  • Invoque la función, la primera vez que siempre le pasará una matriz, por lo que siempre se incluirá en la rama isArray
  • Devuelve la matriz aplanada.

Enlaces relevantes

:sunflower: Solución de código intermedio:

function steamrollArray(arr) { 
  let flat = [].concat(...arr); 
  return flat.some(Array.isArray) ? steamrollArray(flat) : flat; 
 } 
 
 flattenArray([1, [2], [3, [[4]]]]); 

:rocket: Ejecutar código

Explicación del código:

  • Use el operador de dispersión para concatenar cada elemento de arr con una matriz vacía
  • Use el método Array.some() para averiguar si la nueva matriz contiene una matriz aún
  • Si lo hace, utilice nuevamente la llamada recursiva steamrollArray , pasando la nueva matriz para repetir el proceso en las matrices que estaban profundamente anidadas
  • Si no lo hace, devuelve la matriz aplanada.

Enlaces relevantes

:rotating_light: Solución avanzada de código:

function steamrollArray(arr) { 
  return arr.toString() 
    .replace(',,', ',')       // "1,2,,3" => "1,2,3" 
    .split(',')               // ['1','2','3'] 
    .map(function(v) { 
      if (v == '[object Object]') { // bring back empty objects 
        return {}; 
      } else if (isNaN(v)) {        // if not a number (string) 
        return v; 
      } else { 
        return parseInt(v);         // if a number in a string, convert it 
      } 
    }); 
 } 

:rocket: Ejecutar código

Explicación del código:

  • Primero convertimos la matriz en una cadena, que nos dará una cadena de números separados por una coma, una coma doble si hubiera una matriz vacía y un texto de objeto literal si hubiera un objeto, que podemos corregir más adelante en nuestra declaración if .
  • Reemplazamos la coma doble con una, luego la dividimos en una matriz.
  • asigne a través de la matriz y corrija los valores de los objetos y convierta los números de cadena en números regulares.

:clipboard: NOTAS PARA LAS CONTRIBUCIONES:

  • :warning: NO agregue soluciones que sean similares a las soluciones existentes. Si cree que es similar pero mejor , intente fusionar (o reemplazar) la solución similar existente.
  • Agregue una explicación de su solución.
  • Categorice la solución en una de las siguientes categorías: Básica , Intermedia y Avanzada . :traffic_light:

Ver :point_right: Wiki Challenge Solution Template para referencia.