Objetos
Hasta ahora hemos trabajado con variables, arrays y funciones. Ahora vamos a conocer otra estructura fundamental de JavaScript: los objetos.
Un objeto nos permite agrupar diferentes datos que están relacionados entre sí.
Por ejemplo, si queremos guardar información sobre una persona:
let nombre = "Paula";
let edad = 25;
let ciudad = "Valencia";
Tenemos tres variables diferentes.
Un objeto nos permitirá agrupar toda esta información en una sola variable:
let persona = {
nombre: "Ana",
edad: 25,
ciudad: "Valencia"
};
Ahora todos los datos relacionados con Paula están dentro de persona. Vamos a ver en detalle cómo funcionan los objetos.
¿Qué es un objeto?
Primero que nada, un objeto se distingue porque al crearlo utilizamos las llaves {}. Además, todo objeto está formado obligatoriamente por propiedades.
Cada propiedad tiene siempre un nombre y un valor:
let persona = {
nombre: "Paula",
edad: 25,
ciudad: "Valencia"
};
En este caso:
nombre,edadyciudadson las propiedades."Paula",25y"Valencia"son sus valores.
Una propiedad se escribe siguiendo esta estructura:
propiedad: valor
Las propiedades se separan entre ellas mediante comas.
Crear objetos
Para crear un objeto utilizamos llaves {}.
let persona = {
nombre: "Paula",
edad: 25,
ciudad: "Valencia"
};
También podemos crear un objeto vacío:
let persona = {};
Y añadir propiedades posteriormente.
Los valores de un objeto pueden ser de diferentes tipos:
let producto = {
nombre: "Ordenador",
precio: 900,
disponible: true
};
Incluso podemos guardar arrays como valores:
let persona = {
nombre: "Paula",
hobbies: ["leer", "viajar", "programar"]
};
Consultar propiedades
Para consultar una propiedad podemos utilizar un punto ..
La sintaxis sería:
objeto.propiedad
Por ejemplo para el objeto persona queremos mostrar su nombre y su edad:
let persona = {
nombre: "Paula",
edad: 25
};
console.log(persona.nombre);
console.log(persona.edad);
Salida:
Paula
25
También podemos utilizar corchetes [], pero teniendo en cuenta que las propiedades se escribirán entre comillas dobles "":
console.log(persona["nombre"]);
console.log(persona["edad"]);
Las dos formas son válidas.
Normalmente utilizaremos la notación con punto porque es más sencilla de leer:
persona.nombre
Modificar propiedades
Podemos cambiar el valor de una propiedad utilizando el operador =.
let persona = {
nombre: "Paula",
edad: 25
};
persona.edad = 26; // Aquí
console.log(persona.edad);
Salida:
26
También podemos modificar una propiedad de tipo String:
persona.nombre = "Laura";
Ahora el objeto sería:
{
nombre: "Laura",
edad: 26
}
Añadir propiedades
No necesitamos que todas las propiedades existan cuando creamos el objeto.
Podemos añadir nuevas propiedades posteriormente:
En el siguiente ejemplo, inicialmente tenemos el objeto persona con solamente la propiedad nombre y su valor. Y con el punto . añadimos después las propiedad que queramos junto con su valor:
let persona = {
nombre: "Paula"
};
persona.edad = 25;
persona.ciudad = "Valencia";
Ahora tenemos:
{
nombre: "Paula",
edad: 25,
ciudad: "Valencia"
}
Por tanto, la misma sintaxis sirve tanto para modificar una propiedad existente como para crear una nueva.
Eliminar propiedades
Para eliminar una propiedad utilizamos delete.
let persona = {
nombre: "Paula",
edad: 25,
ciudad: "Valencia"
};
delete persona.edad;
console.log(persona);
Resultado:
{
nombre: "Paula",
ciudad: "Valencia"
}
La propiedad edad ha desaparecido del objeto.
Objetos y if
Podemos utilizar las propiedades de un objeto dentro de condiciones.
Por ejemplo:
let persona = {
nombre: "Paula",
edad: 25
};
if (persona.edad >= 18) {
console.log(`${persona.nombre} es mayor de edad`);
}
Salida:
Paula es mayor de edad
También podemos comprobar propiedades de tipo booleano:
let producto = {
nombre: "Ordenador",
disponible: true
};
if (producto.disponible) {
console.log("El producto está disponible");
}
Salida:
El producto está disponible
Los objetos resultan especialmente útiles cuando queremos que una condición dependa de diferentes características de un mismo elemento. Por ejemplo:
let trabajo = {
area: "Informática",
salario: 1800,
experiencia: "Junior"
}
if (trabajo.salario > 1500 && trabajo.experiencia === "Junior"){
console.log("Tienes un buen salario para empezar");
}
Objetos dentro de objetos
Los objetos pueden contener otros objetos como propiedades. Esto nos permite representar información más compleja.
Por ejemplo, una persona puede tener una propiedad direccion, que a su vez guarda un objeto con las propiedades ciudad, calle y numero:
let persona = {
nombre: "Paula",
edad: 25,
direccion: {
ciudad: "Valencia",
calle: "Colón",
numero: 10
}
};
Para acceder a las propiedades del objeto interior, simplemente encadenamos los puntos, empezando del más general al más específico:
console.log(persona.direccion.ciudad);
Salida:
Valencia
Observa que el primer punto es:
persona.direccion;
Ésto nos devolvería el valor asociado a direccion:
{
ciudad: "Valencia",
calle: "Colón",
numero: 10
}
Por lo que si ahora queremos la ciudad, volvemos a poner otro punto:
persona.direccion.ciudad;
También podemos modificar sus propiedades:
persona.direccion.numero = 15;
Ahora numero vale 15.
Podemos pensar en la estructura de esta forma:
persona
├── nombre
├── edad
└── direccion
├── ciudad
├── calle
└── numero
Arrays dentro de objetos
Un objeto también puede contener un array.
let persona = {
nombre: "Paula",
hobbies: ["leer", "viajar", "programar"]
};
Para acceder a un elemento del array utilizamos su índice como siempre:
console.log(persona.hobbies[0]);
Salida:
leer
Aquí estamos combinando una propiedad de un objeto con un índice de un array:
persona.hobbies[0]
Al igual que antes vamos de más general a más específico. Si queremos saber el primer hobbie, primero necesitamos acceder al array de hobbies:
persona.hobbies;
Que devolvería:
["leer", "viajar", "programar"]
Y una vez accedemos al array, lo podemos tratar como tal y usar el índice del primer hobbie:
persona.hobbies[0]
Es muy habitual combinar objetos con arrays, simpelemente hemos de ir con cuidado y poner la propiedad o el índice de más "afuera" a más "adentro":
let persona = {
nombre: "Paula",
hobbies: {
deporte: ["natacion", "atletismo"],
musica: ["trompeta", "piano"]
}
};
console.log(persona.hobbies.musica[0]); // trompeta
Arrays de objetos
También podemos hacer lo contrario: tener un array cuyos elementos sean objetos.
Por ejemplo:
let personas = [
{
nombre: "Paula",
edad: 25
},
{
nombre: "Luis",
edad: 30
},
{
nombre: "Lluna",
edad: 22
}
];
En este caso, podemos utilizar el índice para acceder a un objeto concreto:
console.log(personas[0]);
Resultado:
{ nombre: "Paula", edad: 25 }
Y después acceder a una propiedad de ese objeto:
console.log(personas[0].nombre);
Salida:
Paula
La estructura es:
personas
│
├── [0] → { nombre: "Paula", edad: 25 }
├── [1] → { nombre: "Luis", edad: 30 }
└── [2] → { nombre: "Lluna", edad: 22 }
Por tanto:
personas[1].nombre
significa:
personas→ accedemos al array.[1]→ seleccionamos el segundo elemento..nombre→ accedemos a la propiedadnombredel objeto.
El resultado será:
Luis
Arrays de objetos con arrays
Podemos combinar todavía más estructuras.
Por ejemplo, cada persona puede tener varios hobbies:
let personas = [
{
nombre: "Paula",
hobbies: ["leer", "viajar"]
},
{
nombre: "Luis",
hobbies: ["fútbol", "cine"]
}
];
Podemos acceder al primer hobby de Paula (que es la primera persona):
console.log(personas[0].hobbies[0]);
Salida:
leer
Y al segundo hobby de Luis (que es la segunda persona):
console.log(personas[1].hobbies[1]);
Salida:
cine
Aquí estamos combinando índices y propiedades varias veces:
personas[1].hobbies[1]
personas
↓
[1] → segundo objeto
↓
.hobbies → array de hobbies
↓
[1] → segundo hobby
↓
"cine"
Recorrer objetos con for
Es muy común tener un array de objetos.
Por ejemplo, podemos imaginarlo como un listado que contiene la misma información de varias personas. Por tanto para varias personas quiero guardar el nombre y la edad:
let personas = [
{ nombre: "Paula", edad: 20 },
{ nombre: "Luis", edad: 17 },
{ nombre: "Lluna", edad: 30 }
];
Aquí tenemos un array ([]) que contiene tres objetos ({}), todos ellos con las mismas propiedades nombre y edad pero cada uno con valores distintos.
Si queremos imprimir el nombre de todos ellos podemos recorrerlo utilizando un for normal:
for (let i = 0; i < personas.length; i++) {
console.log(personas[i].nombre);
}
Salida:
Paula
Luis
Lluna
Analizemos el bucle for:
- Como estamos recorriendo un array, empezamos desde la posción
0hastapersonas.length. Lo
for (let i = 0; i < personas.length; i++)
- Como estamos recorriendo un array, la
isignifica la posición. Por lo que el elemento en sí espersonas[i]. En este ejemplo el elemento del array es un objeto:
{ nombre: "Paula", edad: 20 }
{ nombre: "Luis", edad: 17 }
{ nombre: "Lluna", edad: 30 }
Por lo que personas[i] lo tratamos como si fuese un objeto, por tanto...
- Accedemos a las propiedades como
personas[i].propiedad.
console.log(personas[i].nombre);
Podemos acceder a cualquier propiedad siempre con listado[i].propiedad:
for (let i = 0; i < personas.length; i++) {
if (personas[i].edad >= 18) {
console.log(`${personas[i].nombre} es mayor de edad`);
}
}
Salida:
Paula es mayor de edad
Lluna es mayor de edad
Aquí combinamos lo que ya conocemos:
- Un array para almacenar varias personas.
- Un
forpara recorrerlas. - Un
ifpara comprobar la edad. - Las propiedades del objeto para obtener la información.
Por otro lado, como aunque los elementos sean objetos, lo que en verdad recorremos es un simple array. Por lo que podemos usar también el for...of:
for (let objeto of personas){
console.log(objeto.nombre);
}
Aquí, como vimos en la lección de arrays, no necesitamos ningún índice ni posición, ya que con esta estructura la variable objeto en este caso ya hace referencia al propio elemento del array (un objeto). Por lo que podemos utilizar directamente el punto para acceder a sus propiedaddes.
for...in
Acabamos de ver una estructura muy común de arrays de objetos y cómo se recorren:
let personas = [
{ nombre: "Paula", edad: 20 },
{ nombre: "Luis", edad: 17 },
{ nombre: "Lluna", edad: 30 }
];
Pero también existe una manera de recorrer objetos en sí. Para ello utilizaremos una nueva variación del for llamada for...in.
Por ejemplo, el objeto persona tiene las propiedades nombre, edad y ciudad:
let persona = {
nombre: "Paula",
edad: 25,
ciudad: "Valencia"
};
Con el for...in podemos recorrer sus propiedades:
for (let propiedad in persona) {
console.log(propiedad);
}
Salida:
nombre
edad
ciudad
La variable propiedad contiene el nombre de cada propiedad. Si te fijas tiene exactamente la misma estructura que un for...of pero con la palabra in.
Este for...in permite acceder directamente a la propiedad. Pero podemos aprovechar que tenemos acceso al nombre de la propiedad para obtener también su valor utilizando los corchetes:
for (let propiedad in persona) {
console.log(`${propiedad}: ${persona[propiedad]}`);
}
Salida:
nombre: Paula
edad: 25
ciudad: Valencia
Es importante observar que utilizamos:
persona[propiedad]
y no:
persona.propiedad
Esto ocurre porque propiedad es una variable cuyo contenido va cambiando. Por lo que dentro de un for...in solo funciona el acceso a valores con corchetes.
for...of vs for...in
Es importante no confundir estos dos bucles.
Para un array:
let frutas = ["manzana", "plátano", "naranja"];
for (let fruta of frutas) {
console.log(fruta);
}
for...of recorre los elemento del array.
Para un objeto:
let persona = {
nombre: "Ana",
edad: 25
};
for (let propiedad in persona) {
console.log(propiedad);
}
for...in recorre las propiedades.
Podemos recordarlo así:
for...of→ elementos de una colección.for...in→ propiedades de un objeto.
Objetos y JSON
Cuando trabajamos con aplicaciones web es muy habitual tener que enviar o recibir objetos.
Para ello se utiliza frecuentemente JSON.
JSON significa JavaScript Object Notation y es un formato de texto utilizado para representar datos estructurados.
Un objeto JavaScript puede tener este aspecto:
let persona = {
nombre: "Paula",
edad: 25
};
Mientras que su representación en JSON sería:
{
"nombre": "Paula",
"edad": 25
}
La principal diferencia que debemos observar es que en JSON los nombres de las propiedades aparecen entre comillas dobles y se escriben en fichero .json aparte.
Convertir un objeto a JSON
Para convertir un objeto JavaScript en un String JSON utilizamos:
JSON.stringify()
Por ejemplo:
let persona = {
nombre: "Paula",
edad: 25
};
let json = JSON.stringify(persona);
console.log(json);
Obtenemos un String JSON que representa el objeto persona:
{"nombre":"Paula","edad":25}
Ahora json es un String con estructura JSON, no un objeto.
Podemos comprobarlo:
console.log(typeof json);
Salida:
string
Esto es muy habitual cuando necesitamos enviar información a un servidor.
Convertir JSON a objeto
También podemos hacer el proceso contrario.
Si tenemos un String que contiene JSON, podemos convertirlo en un objeto utilizando:
JSON.parse()
Por ejemplo:
let json = '{"nombre":"Paula","edad":25}';
let persona = JSON.parse(json);
console.log(persona.nombre);
Salida:
Paula
Ahora persona vuelve a ser un objeto JavaScript.
Podemos comprobarlo:
console.log(typeof persona);
Salida:
object
Por tanto:
Objeto JavaScript
↓
JSON.stringify()
↓
String JSON
Y podemos hacer el proceso contrario:
String JSON
↓
JSON.parse()
↓
Objeto JavaScript
Resumen
Los objetos permiten agrupar información relacionada mediante propiedades.
Podemos:
- Crear objetos utilizando
{}. - Consultar propiedades con
.o[]. - Modificar propiedades utilizando
=. - Añadir nuevas propiedades.
- Eliminar propiedades utilizando
delete. - Utilizar sus propiedades en condiciones
if. - Recorrer arrays de objetos utilizando
for. - Recorrer las propiedades de un objeto utilizando
for...in. - Convertir objetos a JSON con
JSON.stringify(). - Convertir JSON a objetos con
JSON.parse().
Una de las estructuras que utilizaremos constantemente será un array de objetos:
let productos = [
{ nombre: "Ratón", precio: 20 },
{ nombre: "Teclado", precio: 40 },
{ nombre: "Monitor", precio: 200 }
];
Esta estructura es especialmente importante porque aparece constantemente al trabajar con APIs, bases de datos y aplicaciones web.
Ejemplos resueltos
Ejercicio resuelto 1 - Información de un producto
Enunciado
Crea un objeto que represente un producto con nombre, precio y disponibilidad.
Si el producto está disponible, muestra un mensaje indicando que se puede comprar.
Solución
let producto = {
nombre: "Teclado",
precio: 40,
disponible: true
};
if (producto.disponible) {
console.log(`${producto.nombre} disponible por ${producto.precio} €`);
}
Salida:
Teclado disponible por 40 €
Explicación
Creamos un objeto con tres propiedades.
Después utilizamos if para comprobar el valor de disponible.
Ejercicio resuelto 2 - Recorrer una lista de productos
Enunciado
Tenemos varios productos. Muestra únicamente los productos que cuesten más de 50 €.
Solución
let productos = [
{ nombre: "Ratón", precio: 20 },
{ nombre: "Teclado", precio: 60 },
{ nombre: "Monitor", precio: 200 }
];
for (let i = 0; i < productos.length; i++) {
if (productos[i].precio > 50) {
console.log(productos[i].nombre);
}
}
Salida:
Teclado
Monitor
Explicación
El for recorre el array.
En cada repetición accedemos al objeto correspondiente mediante:
productos[i]
Después consultamos su propiedad precio:
productos[i].precio
Finalmente, el if decide si debemos mostrar el producto.
Ejercicio resuelto 3 - Recorrer las propiedades de un objeto
Enunciado
Muestra todas las propiedades y valores de una persona utilizando for...in.
Solución
let persona = {
nombre: "Ana",
edad: 25,
ciudad: "Valencia"
};
for (let propiedad in persona) {
console.log(`${propiedad}: ${persona[propiedad]}`);
}
Salida:
nombre: Ana
edad: 25
ciudad: Valencia
Explicación
En cada repetición, propiedad contiene un nombre diferente:
nombre
edad
ciudad
Utilizamos ese nombre para acceder al valor correspondiente:
persona[propiedad]
Ejercicio resuelto 4 - Convertir un objeto a JSON
Enunciado
Crea un objeto que represente un usuario y conviértelo en un String JSON.
Solución
let usuario = {
nombre: "Carlos",
edad: 30,
activo: true
};
let json = JSON.stringify(usuario);
console.log(json);
Salida:
{"nombre":"Carlos","edad":30,"activo":true}
Explicación
JSON.stringify() convierte el objeto JavaScript en un String que utiliza el formato JSON.
Esto resulta especialmente útil para enviar objetos a través de una API.