¿Que es Destructuring?

Destructuring o Desctructuración es una característica de JavaScript agregada en la versión ES6 (2015) que nos permite extraer o “destructurar” datos desde estructuras como Arrays, Objetos, Maps o Sets, y crear de manera “sencilla” nuevas variables con los datos obtenidos.

Sintaxis

La sintaxis del destructuring es muy sencilla, por un lado tenemos las variables que vamos a crear y por el otro el objeto/colección de donde extraeremos las propiedades/elementos:

// para objetos:
let { propiedad1, propiedad2 } = objeto;

// para colecciones (lo veremos mas adelante):
const [ elemento0, elemento1 ] = coleccion;

Pensemos en un objeto simple y una tarea repetitiva:

const persona = {
    nombre: "Alejandro",
    apellido: "Nuñez",
    pais: "Argentina"
};

const nombre = persona.nombre;
const apellido = persona.apellido;

Es una tarea común almacenar alguna propiedad de un objeto para luego ser utilizada, podemos asignarla a una variable como en el ejemplo, o escribir “persona.nombre” cada vez que necesitemos ese valor.

Lo que destructuring permite es hacer este proceso de una manera mas simple y directa:

const { nombre, apellido } = persona;

Esta es la sintaxis de destructuración de un objeto, usamos las llaves “{}” al lado izquierdo de una asignación para indicar que estamos des-tructurando el valor de lo que está en el lado derecho.

Este código simplemente dice: Crea dos variables: “nombre” y “apellido”, luego toma desde el objeto “persona” las propiedades con igual nombre y asigna sus valores.

Pero no es la única sintaxis, también existe otra manera más personalizada de asignar las propiedades de un objeto a nuestras variables:

const { nombre: miNombre, apellido: miApellido } = persona;

console.log(nombre); // Error: nombre is not defined
console.log(miNombre); // Alejandro

El identificador “nombre” antes de los dos puntos (:) es la propiedad del objeto y el identificador “miNombre” después de los dos puntos es la variable creada.

Desestructuración de objetos anidados

Generalmente, los objetos suelen contener propiedades anidadas, con destructuring podemos acceder a sus propiedades de manera sencilla, esto puede ser utilizado de forma anidada tantas veces como quieras:

const persona = {
    nombre: "Alejandro",
    apellido: "Nuñez",
    links: {
        social: {
            twitter: "@aleja24",
            instagram: "alejandro123"
        },
        profesional: {
            email: "alejandro@gmail"
        }
    }
};

const { twitter } = persona.links.social;
// o tambien se puede
const { links: { social: { twitter, instagram }, profesional: { email } } } = persona;

console.log(twitter); // @aleja24
console.log(instagram); // alejandro123
console.log(email); // alejandro@gmail

Podemos destructurar propiedades anidadas del objeto en variables individuales, como también destructurar la propiedad contenedora de estas propiedades individuales, con el objeto persona del ejemplo anterior también podemos hacer:

const { links: { social, profesional } }  = persona;

console.log(social); // {twitter: '@aleja24', instagram: 'alejandro123'}
console.log(profesional); // {email: 'alejandro@gmail'}

Valores predeterminados

También podemos configurar valores predeterminados, cuando la propiedad exista o no.

const persona = {
    nombre: "Alejandro",
    apellido: "Nuñez",
    edad: 24
};

let { nombre, apellido, alias = '', edad: años = 18 } = persona;

console.log(alias); // ' '
console.log(años); // 24

En este ejemplo, asignamos una cadena vacía a la variable “alias” cuando el objeto persona no tiene la propiedad “alias”.

Además, asignamos el contenido de la propiedad "edad" a la variable "años" con el valor predeterminado 18 (la variable tomará  este valor en caso de que no exista la propiedad "edad" en el objeto).

Sin embargo, cuando el objeto persona tiene la propiedad alias, la asignación funciona como de costumbre:

const persona = {
    nombre: "Alejandro",
    apellido: "Nuñez",
    alias: "Ale"
};

let { nombre, apellido, alias = '', edad: años = 18 } = persona;

console.log(alias); // Ale
console.log(años); // 18

Destructurar objetos nulos

Una función puede devolver un objeto o un null en algunas situaciones, por ejemplo:

function getPersona(){
    return null;
}

Y si destructuramos el objeto

let { nombre, apellido } = getPersona();

console.log(nombre, apellido);

El código nos lanzará un TypeError:

Para evitar esto, podemos usar el operador OR (||) para devolver un objeto vacío:

let { nombre, apellido } = getPersona() || {};

console.log(nombre); // undefined
console.log(apellido); // undefined

Ahora no ocurrirá ningún error, y nombre y apellido serán undefined, ya que "{}" es un objeto vacio.

Destructurar Arrays

Destructuración no está limitada solo a objetos, también podemos destructurar Arrays.

const array = [ "Hola", "soy", "Alejandro" ];

Si quisiéramos obtener cada valor y almacenarlos en variables de manera tradicional haríamos lo siguiente:

const saludo = array[0];
const nombre = array[2];

Si usamos destructuración podemos hacerlo más simple, pero a diferencia de la destructuración de objetos, aqui debemos usar los corchetes “[]” del lado izquierdo de la asignación para indicar que estamos destructurando un array:

const [ saludo, , nombre ] = array;

console.log(saludo); // Hola
console.log(nombre); // Alejandro

Al destructurar un array hacemos uso de la posición del elemento en el arreglo para las asignaciones, así saludo es equivalente a array[0]. Esto también permite “saltarse” algún elemento del array que no nos interesa, simplemente escribimos un espacio. En vez de escribir el nombre de la variable que no nos interesa, en este caso la posición del array[1] , simplemente escribimos un espacio entre las comas correspondientes.

Sabiendo esto, también es posible lo siguiente:

const array = [ "Hola", "mi", "nombre", "es", "Alejandro" ];

const [ , , , , nombre ] = array;

console.log(nombre); // Alejandro

Aplicando Spread

A veces solo queremos asignar a variables algunos valores del arreglo y seguir contando con los valores restantes dentro de otro array. En este caso tenemos que usar el operador Spread (...) agregado en ES6.

const participantes = [ "Ale", "Lucio", "Santi", "Fede", "Yanet", "Juan"];

const [primero, segundo, tercero, ...resto] = participantes;

console.log(primero); // Ale
console.log(segundo); // Lucio
console.log(tercero); // Santi
console.log(resto); // ["Fede", "Yanet", "Juan"]

Conclusión

En resumen, la destructuración nos facilita extraer valores de un elemento de manera múltiple para almacenarlos en variables.

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!