Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Los encantamientos transformadores de Elyse
Los encantamientos transformadores de Elyse

Los encantamientos transformadores de Elyse

Ejercicio de aprendizaje

Introducción

En JavaScript, la clase Array tiene muchos métodos integrados potentes para transformar arrays. Estos métodos hacen que sea mucho más fácil convertir un array en otro de lo que sería usando un simple bucle for o una manipulación más directa.

Algunos métodos son puros, lo que significa que no modifican el array original. En su lugar, devuelven uno nuevo. Sin embargo, otros métodos manipulan el array sobre el que se llaman y no devuelven el array modificado.

A continuación se presentan algunos de los métodos más utilizados para transformar arrays. Puedes encontrar una lista completa de los métodos disponibles en la documentación de MDN.

map (puro)

Crea un nuevo array transformando cada elemento según una función pasada como argumento. Estas funciones de callback a menudo se escriben como funciones flecha.

let arr = [1, 2, 3, 4];

const newArr = arr.map((value) => value - 1);
console.log(newArr);
// => [0, 1, 2, 3]
console.log(arr);
// => [1, 2, 3, 4]

Cabe destacar que el array resultante siempre tendrá la misma longitud que el original.

filter (puro)

Crea un array filtrando el actual, dada una función de filtrado (que devuelve true si el elemento debe conservarse y false si debe eliminarse).

let arr = [1, 2, 3, 4];

arr.filter((value) => value % 2 === 0);
// => [2, 4]

reduce (puro)

Reduce el array a un único valor usando una función que toma un acumulador y el elemento actual del array como parámetros. Esta función indica cómo debe fusionarse el elemento actual en el acumulador y devuelve el acumulador que se usará en la siguiente iteración.

let arr = [1, 2, 3, 4];

// Get the sum of elements
arr.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
// => 10

// Classify the numbers by whether they are odd or not
arr.reduce(
  (accumulator, currentValue) => {
    if (currentValue % 2 === 0) {
      accumulator.even.push(currentValue);
    } else {
      accumulator.odd.push(currentValue);
    }

    return accumulator;
  },
  { even: [], odd: [] },
);
// => { even: [2, 4], odd: [1, 3] }

reverse

Invierte los elementos de un array.

const arr = [1, 2, 3, 4];

arr.reverse();
// => [4, 3, 2, 1]

Este método modifica el array sobre el que se llama.

slice (puro)

Dados un índice de inicio y un índice de fin, crea un subarray a partir del array pasado como parámetro.

El elemento en el índice de fin no se incluirá. Además, todos los parámetros son opcionales: el índice de inicio toma 0 por defecto, y el índice de fin toma por defecto la longitud del array.

const arr = [1, 2, 3, 4];

arr.slice(1, 2); // [2]
arr.slice(1); // [2, 3, 4]
// You can also use negative numbers, that represent the indexes
// starting from the end of the array
arr.slice(-2); // [3, 4]

splice

Elimina o reemplaza y/o añade nuevos elementos de un array.

Toma los siguientes parámetros:

  • el índice del elemento donde empezar a modificar el array
  • el número de elementos que se van a eliminar
  • los elementos que se van a insertar en el array (opcional)

splice devuelve los elementos que se han eliminado.

const arr = ['1', '2', '5', '6'];

// Insert an element at index 2
arr.splice(2, 0, '3');
console.log(arr);
// => ['1', '2', '3', '5', '6']

// Remove 2 elements, starting at index 3 and insert 2 elements
const removed = arr.splice(3, 2, '4', '5');
console.log(removed);
// => ['5', '6']
console.log(arr);
// => ['1', '2', '3', '4', '5']

// Remove 1 element at index 1
arr.splice(1, 1);
console.log(arr);
// => ['1', '3', '4', '5']

sort

Por defecto, sort ordena los elementos de un array convirtiéndolos primero en strings y luego aplicando una comparación de strings (consulta la comparación de conceptos). La ordenación se realiza in situ, lo que significa que el array original se modifica. sort también devuelve ese array modificado, lo cual es conveniente si quieres encadenar otros métodos.

const arr = ['c', 'a', 'z', 'b'];
const result = arr.sort();
console.log(result);
// => ['a', 'b', 'c', 'z']
console.log(arr);
// => ['a', 'b', 'c', 'z']

Para personalizar el comportamiento de la ordenación, puedes pasar una función de comparación como argumento. La propia función de comparación se llama con dos argumentos, que son dos elementos del array. Después debe devolver lo siguiente:

  • un número negativo si el primer argumento debe ordenarse antes que el segundo
  • un número positivo si el primer argumento debe ordenarse después que el segundo
  • 0 si el orden de los elementos debe permanecer igual

Aquí tienes un ejemplo de cómo se puede usar una función de comparación personalizada para ordenar un array de objetos.

const arr = [
  { name: 'Lydia', age: 7 },
  { name: 'Anne', age: 34 },
  { name: 'Holger', age: 59 },
];

arr.sort((item1, item2) => {
  if (item1.name < item2.name) {
    return -1;
  }
  if (item1.name > item2.name) {
    return 1;
  }
  return 0;
});
// => [ { name: 'Anne', age: 34 }, { name: 'Holger', age: 59 },
// { name: 'Lydia', age: 7 } ]

Instrucciones

Elyse, futura maga, continúa su entrenamiento. Recibirá una baraja de cartas e intentará transformar esa baraja. Hará que ciertas cartas aparezcan, desaparezcan, cambien de valor o se reordenen por completo. Para que las cosas sean más fáciles, normalmente solo empieza con cartas numeradas del 1 al 10, aunque algunos trucos pueden dar lugar a que se creen cartas más grandes.

1. Duplica cada una de las cartas

Elyse quiere duplicar el número de cada carta de la baraja. Esto puede dar lugar a cartas con números superiores a los del rango 1-10.

const deck = [1, 2, 3, 4, 10];
seeingDouble(deck);
// => [2, 4, 6, 8, 20]

2. Crea varias copias de cada 3 que haya en la baraja

Elyse quiere triplicar cada 3 que haya en la baraja. Si una baraja empezara con un solo 3, después del truco la baraja tendría tres cartas con el número 3 en lugar de la original.

const deck = [1, 3, 9, 3, 7];
threeOfEachThree(deck);
// => [1, 3, 3, 3, 9, 3, 3, 3, 7]

3. Encuentra las dos cartas del centro exacto de la baraja

Elyse cogerá una baraja de diez cartas y hará desaparecer todas las cartas menos las dos del medio.

const deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
middleTwo(deck);
// => [5, 6]

4. Las dos cartas de los extremos reaparecerán en el medio de la baraja

Elyse quiere mover las cartas de arriba y de abajo de la baraja al centro, en orden inverso.

Puedes suponer que la baraja tiene un número par de cartas.

const deck = [1, 2, 3, 5, 6, 10];
sandwichTrick(deck);
// => [2, 3, 10, 1, 5, 6]

5. Todas las cartas que no sean 2 desaparecen

El número favorito de Elyse hoy es el 2. En este truco, todas las cartas que no sean un 2 desaparecerán de la baraja.

const deck = [1, 2, 3, 4, 10, 2];
twoIsSpecial(deck);
// => [2, 2]

6. Convierte una baraja barajada en una baraja perfectamente ordenada

Elyse desea demostrar su dominio a la hora de reordenar las cartas a la perfección, sin importar lo bien que esté barajada.

const deck = [10, 1, 5, 3, 2, 8, 7];
perfectlyOrdered(deck);
// => [1, 2, 3, 5, 7, 8, 10]

7. Reordena la baraja

Elyse quiere cambiar el orden de las cartas de la baraja. Después del truco, la carta que actualmente está en la parte superior debería acabar en la parte inferior de la baraja. La segunda carta debería acabar en la penúltima posición, etc.

const deck = [10, 1, 5, 3, 2];
reorder(deck);
// => [2, 3, 5, 1, 10]
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Los encantamientos transformadores de Elyse?

Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.