7.5 KiB
title | localeTitle |
---|---|
Steamroller | Apisonadora |
Recuerda usar Read-Search-Ask
si te atascas. Tratar de emparejar el programa y escribe tu propio código
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
Sugerencia: 1
Es necesario comprobar si un elemento es una matriz o no.
intenta resolver el problema ahora
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!
¡Solución por delante!
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]]]]);
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
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]]]]);
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
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
}
});
}
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.
NOTAS PARA LAS CONTRIBUCIONES:
- 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 .
Ver
Wiki Challenge Solution Template
para referencia.