← JavaScript

Arrays y objetos

¿Cómo iteras sobre las propiedades de un objeto y qué métodos usarías? Explica `Object.keys`, `Object.values` y `Object.entries`.

Ver respuesta — intenta responderla en voz alta primero

Object.keys(obj) devuelve un arreglo con las claves, Object.values(obj) con los valores y Object.entries(obj) con pares [clave, valor]. Con estos arreglos puedes usar map, filter, forEach, etc. para iterar sobre objetos.

Los objetos no tienen map ni filter directamente como los arreglos. Para iterar sobre ellos, primero los conviertes en arreglos con:

  • Object.keys(obj): arreglo con las claves.
  • Object.values(obj): arreglo con los valores.
  • Object.entries(obj): arreglo de pares [clave, valor], ideal para iterar con destructuring.

Otros métodos útiles:

  • Object.assign(destino, origen): copia propiedades (superficial).
  • Object.freeze(obj): congela el objeto para que no se pueda modificar.
const producto = { nombre: "Laptop", precio: 1000, stock: 5 };

// Object.keys: las claves
console.log(Object.keys(producto)); // ["nombre", "precio", "stock"]

// Object.values: los valores
console.log(Object.values(producto)); // ["Laptop", 1000, 5]

// Object.entries: pares [clave, valor]
console.log(Object.entries(producto));
// [["nombre", "Laptop"], ["precio", 1000], ["stock", 5]]

// Iterar sobre un objeto con entries y destructuring
for (const [clave, valor] of Object.entries(producto)) {
  console.log(`${clave}: ${valor}`);
}
// nombre: Laptop
// precio: 1000
// stock: 5

// Object.freeze: evita modificaciones
const config = Object.freeze({ modo: "dark" });
config.modo = "light"; // ignorado (o lanza error en modo estricto)
console.log(config.modo); // "dark"

Intentar usar producto.map(...) directamente sobre un objeto: los objetos no tienen map. Primero hay que convertirlos con Object.keys/values/entries. Otro error es olvidar que Object.freeze es superficial: los objetos anidados aún pueden modificarse.

"Para iterar sobre un objeto lo convierto en un arreglo con Object.keys, Object.values o Object.entries. entries es mi favorito porque me da pares clave-valor que puedo desestructurar en un for...of. Una vez que tengo esos arreglos puedo aplicar map, filter o lo que necesite. También conozco Object.assign para combinar objetos y Object.freeze para hacerlos de solo lectura, aunque esto último es superficial."

Reto rápido

Dado { a: 1, b: 2, c: 3 }, usa los métodos de objetos para obtener la suma de todos sus valores.

Ver solución
const obj = { a: 1, b: 2, c: 3 };
const suma = Object.values(obj).reduce((acc, n) => acc + n, 0);
console.log(suma); // 6