Command Palette

Search for a command to run...

Object.keys(), Object.values() y Object.entries(): Iterar Objetos en JavaScript

Aprende a usar Object.keys(), Object.values() y Object.entries() para extraer e iterar sobre las propiedades de objetos de forma moderna y eficiente.

Lectura: 14 min
Nivel: Principiante

TL;DR - Resumen rápido

  • Object.keys() retorna un array con las claves enumerables propias del objeto
  • Object.values() retorna un array con los valores de las propiedades enumerables
  • Object.entries() retorna un array de pares [clave, valor] para cada propiedad
  • Estos métodos ignoran propiedades heredadas del prototipo, solo propiedades propias
  • Son ideales para usar con métodos de arrays como map(), filter() y forEach()
  • No incluyen propiedades con símbolos como claves ni propiedades no enumerables

Introducción: Iterar Objetos de Forma Moderna

En JavaScript, los objetos son estructuras clave-valor fundamentales, pero a diferencia de los arrays, no tienen métodos de iteración nativos como map() o forEach(). Object.keys(), Object.values() y Object.entries() fueron introducidos para resolver este problema, permitiendo convertir las propiedades de un objeto en arrays que pueden ser fácilmente iterados y transformados.

Estos tres métodos son la forma moderna y recomendada de trabajar con las propiedades de objetos, reemplazando el uso de bucles for...in en la mayoría de casos. Todos retornan arrays, lo que permite usar la rica API de métodos de arrays para manipular datos de objetos.

Propiedades enumerables y propias

Estos métodos solo retornan propiedades enumerables y propias del objeto. No incluyen propiedades heredadas del prototipo, propiedades no enumerables definidas con Object.defineProperty(), ni propiedades con símbolos como claves.

Object.keys(): Obtener las Claves del Objeto

Object.keys() retorna un array que contiene todas las claves (nombres de propiedades) enumerables del objeto. Es útil cuando necesitas conocer qué propiedades tiene un objeto o iterar sobre sus claves para acceder a valores condicionalmente.

object-keys-basico.js
Loading code...

En este ejemplo, Object.keys() extrae las claves del objeto usuario y las retorna como un array. Esto es especialmente útil para validaciones, conteo de propiedades, o cuando necesitas iterar solo sobre las claves sin acceder a los valores. El orden de las claves sigue las reglas de iteración de objetos: primero claves numéricas en orden ascendente, luego claves string en orden de inserción.

Ventaja sobre Object.getOwnPropertyNames()

Object.keys() solo retorna propiedades enumerables, mientras que Object.getOwnPropertyNames() incluye todas las propiedades propias, incluso las no enumerables. Para la mayoría de casos de uso, Object.keys() es la opción correcta y más predecible.

Object.values(): Obtener los Valores del Objeto

Object.values() retorna un array con los valores de todas las propiedades enumerables del objeto. Es ideal cuando solo te interesan los valores y no necesitas las claves, como al sumar todos los valores numéricos o verificar si algún valor cumple una condición.

object-values-basico.js
Loading code...

Object.values() es especialmente útil para operaciones agregadas como suma, promedio, máximo/mínimo, o búsqueda de valores específicos. En el ejemplo, primero extraemos todos los valores del objeto de ventas y luego usamos reduce() para calcular el total. Este enfoque es más limpio y funcional que iterar manualmente con un bucle for...in.

  • Calcular totales, promedios o estadísticas de valores numéricos
  • Buscar si algún valor cumple una condición con some() o every()
  • Convertir valores a otro formato con map()
  • Validar que todos los valores sean del tipo esperado

Object.entries(): Obtener Pares Clave-Valor

Object.entries() retorna un array de arrays, donde cada sub-array contiene un par [clave, valor]. Este método es el más versátil de los tres, ya que proporciona acceso tanto a las claves como a los valores simultáneamente, siendo ideal para transformaciones complejas y desestructuración.

object-entries-basico.js
Loading code...

Object.entries() es particularmente poderoso cuando se combina con desestructuración de arrays en loops. En el ejemplo, [clave, valor] en el forEach() permite acceder directamente a cada propiedad y su valor sin necesidad de índices. Este método también es fundamental para convertir objetos en estructuras como Map, que acepta exactamente el formato que entries() retorna.

Conversión a Map

Object.entries() es perfecto para convertir objetos en Map: new Map(Object.entries(obj)). Esto es útil cuando necesitas las ventajas de Map como preservar el orden de inserción o usar cualquier tipo de dato como clave.

Casos Prácticos de Uso

Estos métodos brillan cuando se combinan con los métodos funcionales de arrays. A continuación veremos casos de uso reales que aprovechan esta sinergia para escribir código más limpio y expresivo.

Iteración y Transformación de Objetos

Una de las aplicaciones más comunes es transformar objetos creando nuevos objetos con propiedades modificadas o filtradas. Esto es especialmente útil para manipular datos que vienen de APIs o formularios.

iteracion-transformacion.js
Loading code...

Este ejemplo muestra cómo Object.entries() permite transformar un objeto completo de manera funcional. Primero convertimos el objeto a pares [clave, valor], aplicamos transformaciones a los valores con map(), y luego reconstruimos el objeto con Object.fromEntries(). Este patrón es común en el procesamiento de datos y evita mutar el objeto original.

Object.fromEntries() complementa entries()

Object.fromEntries() es el método inverso de Object.entries(). Acepta un array de pares [clave, valor] y retorna un objeto. Esta combinación entries() + transformación + fromEntries() es un patrón poderoso para manipular objetos de forma inmutable.

Filtrado de Propiedades de Objetos

Filtrar propiedades de un objeto es otra operación común. Puedes filtrar por claves, por valores, o por ambos usando Object.entries() combinado con filter() y Object.fromEntries().

filtrado-objetos.js
Loading code...

El patrón entries() → filter() → fromEntries() es la forma moderna de filtrar objetos sin bucles explícitos. Este enfoque es funcional, inmutable y más legible que alternativas imperativas. Es especialmente útil para limpiar datos, remover propiedades no deseadas, o crear subconjuntos de objetos basados en criterios.

Comparación con for...in

Antes de Object.keys(), values() y entries(), la forma más común de iterar objetos era con for...in. Sin embargo, estos métodos modernos tienen ventajas importantes que los hacen preferibles en la mayoría de casos.

comparacion-for-in.js
Loading code...

La principal diferencia es que for...in itera sobre propiedades heredadas del prototipo, mientras que Object.keys/values/entries solo retornan propiedades propias. Además, los métodos Object retornan arrays, permitiendo usar métodos funcionales como map(), filter() y reduce() directamente, lo que resulta en código más expresivo y menos propenso a errores.

  • Object.keys/values/entries ignoran propiedades heredadas automáticamente
  • Retornan arrays, permitiendo usar métodos funcionales inmediatamente
  • No requieren verificaciones con hasOwnProperty() en cada iteración
  • Más predecibles y seguros para objetos con prototipos modificados

Cuándo usar for...in

for...in aún es útil cuando específicamente necesitas iterar propiedades heredadas, o cuando el rendimiento es crítico en objetos muy grandes (for...in es ligeramente más rápido). Para la mayoría de casos, prefiere Object.keys/values/entries.

Propiedades Heredadas y Enumerables

Es importante entender qué propiedades incluyen estos métodos y cuáles excluyen. Solo se incluyen propiedades enumerables y propias, excluyendo propiedades heredadas del prototipo y propiedades no enumerables.

propiedades-heredadas.js
Loading code...

Este ejemplo demuestra que Object.keys() (y por extensión values() y entries()) solo retorna propiedades propias del objeto, no aquellas heredadas del prototipo. Además, las propiedades definidas como no enumerables con Object.defineProperty() también se excluyen. Si necesitas incluir propiedades heredadas, debes usar for...in. Si necesitas propiedades no enumerables, usa Object.getOwnPropertyNames().

Símbolos como claves

Object.keys/values/entries no incluyen propiedades cuyas claves son símbolos. Para obtener símbolos, usa Object.getOwnPropertySymbols(). Esto es importante si trabajas con código que usa símbolos para propiedades especiales.

Limitaciones y Casos Especiales

Aunque estos métodos son muy útiles, tienen algunas limitaciones y casos especiales que debes conocer para evitar bugs sutiles en tu código.

limitaciones.js
Loading code...

El orden de iteración de objetos puede sorprender: claves numéricas se ordenan ascendentemente primero, luego claves string en orden de inserción, y finalmente símbolos. Además, estos métodos no funcionan con primitivos directamente en versiones antiguas de JavaScript, aunque JavaScript moderno los convierte automáticamente a objetos wrapper. Para arrays, técnicamente funcionan pero usar métodos de arrays es más apropiado.

Precaución con objetos anidados

Object.values() y entries() solo acceden al primer nivel. Si tu objeto tiene objetos anidados, estos se retornan como referencia, no como copias profundas. Para procesar objetos anidados, necesitas recursión o bibliotecas como lodash.

Resumen: Object.keys, values, entries

Conceptos principales:

  • Object.keys() retorna array de claves enumerables propias
  • Object.values() retorna array de valores de propiedades enumerables
  • Object.entries() retorna array de pares [clave, valor]
  • Solo incluyen propiedades propias, no heredadas del prototipo
  • Retornan arrays, permitiendo usar métodos funcionales como map/filter
  • No incluyen propiedades no enumerables ni símbolos

Mejores prácticas:

  • Preferir estos métodos sobre for...in para iteración de objetos
  • Usar Object.entries() cuando necesitas tanto claves como valores
  • Combinar con fromEntries() para transformaciones inmutables
  • Usar desestructuración [clave, valor] con entries() para legibilidad
  • Verificar si necesitas propiedades heredadas antes de elegir método
  • Recordar que solo acceden al primer nivel en objetos anidados