Alejémonos de las estructuras de datos individuales y hablemos de las iteraciones sobre ellas.
En el capítulo anterior vimos los métodos map.keys()
, map.values()
, map.entries()
.
Estos métodos son genéricos, existe un acuerdo común para utilizarlos para estructuras de datos. Si alguna vez creamos una estructura de datos propia, deberíamos implementarla también.
Son compatibles con:
Map
Set
Array
Los objetos simples también admiten métodos similares, pero la sintaxis es un poco diferente.
Para objetos simples, están disponibles los siguientes métodos:
Object.keys(obj): devuelve una matriz de claves.
Object.values(obj): devuelve una matriz de valores.
Object.entries(obj): devuelve una matriz de pares [key, value]
.
Tenga en cuenta las distinciones (en comparación con el mapa, por ejemplo):
Mapa | Objeto | |
---|---|---|
Sintaxis de llamada | map.keys() | Object.keys(obj) , pero no obj.keys() |
Devoluciones | iterable | Matriz “real” |
La primera diferencia es que tenemos que llamar a Object.keys(obj)
y no obj.keys()
.
¿Por qué es así? La razón principal es la flexibilidad. Recuerde, los objetos son la base de todas las estructuras complejas en JavaScript. Por lo tanto, podemos tener un objeto propio como data
que implementa su propio método data.values()
. Y todavía podemos llamar Object.values(data)
en él.
La segunda diferencia es que los métodos Object.*
devuelven objetos de matriz "reales", no sólo un iterable. Esto se debe principalmente a razones históricas.
Por ejemplo:
dejar usuario = { nombre: "Juan", edad: 30 };
Object.keys(user) = ["name", "age"]
Object.values(user) = ["John", 30]
Object.entries(user) = [ ["name","John"], ["age",30] ]
A continuación se muestra un ejemplo del uso de Object.values
para recorrer los valores de propiedad:
dejar usuario = { nombre: "Juan", edad: 30 }; // recorrer los valores for (dejar valor de Object.values(usuario)) { alerta(valor); // Juan, entonces 30 }
Object.keys/values/entries ignoran las propiedades simbólicas
Al igual que un bucle for..in
, estos métodos ignoran las propiedades que utilizan Symbol(...)
como claves.
Normalmente eso es conveniente. Pero si también queremos claves simbólicas, entonces hay un método separado Object.getOwnPropertySymbols que devuelve una matriz de claves simbólicas únicamente. Además, existe un método Reflect.ownKeys(obj) que devuelve todas las claves.
Los objetos carecen de muchos métodos que existen para matrices, por ejemplo, map
, filter
y otros.
Si queremos aplicarlos, podemos usar Object.entries
seguido de Object.fromEntries
:
Utilice Object.entries(obj)
para obtener una matriz de pares clave/valor de obj
.
Utilice métodos de matriz en esa matriz, por ejemplo, map
, para transformar estos pares clave/valor.
Utilice Object.fromEntries(array)
en la matriz resultante para convertirla nuevamente en un objeto.
Por ejemplo, tenemos un objeto con precios y nos gustaría duplicarlos:
dejar precios = { plátano: 1, naranja: 2, carne: 4, }; let doublePrices = Object.fromEntries( // convierte precios a una matriz, asigna cada par clave/valor a otro par // y luego fromEntries devuelve el objeto Object.entries(precios).map(entrada => [entrada[0], entrada[1] * 2]) ); alerta(preciosdobles.carne); // 8
Puede parecer difícil a primera vista, pero se vuelve fácil de entender después de usarlo una o dos veces. Podemos hacer poderosas cadenas de transformaciones de esta manera.
importancia: 5
Hay un objeto salaries
con un número arbitrario de salarios.
Escribe la función sumSalaries(salaries)
que devuelve la suma de todos los salarios usando Object.values
y el bucle for..of
.
Si salaries
están vacíos, entonces el resultado debe ser 0
.
Por ejemplo:
dejar salarios = { "Juan": 100, "Pete": 300, "María": 250 }; alerta( sumaSalarios(salarios) ); // 650
Abra una caja de arena con pruebas.
función sumaSalarios(salarios) { sea suma = 0; for (let salario de Object.values(salarios)) { suma += salario; } suma de devolución; // 650 } dejar salarios = { "Juan": 100, "Pete": 300, "María": 250 }; alerta( sumaSalarios(salarios) ); // 650
O, opcionalmente, también podríamos obtener la suma usando Object.values
y reduce
:
// reducir los bucles sobre una variedad de salarios, // sumándolos // y devuelve el resultado función sumaSalarios(salarios) { return Object.values(salarios).reduce((a, b) => a + b, 0) // 650 }
Abra la solución con pruebas en un sandbox.
importancia: 5
Escriba una función count(obj)
que devuelva el número de propiedades del objeto:
dejar usuario = { nombre: 'Juan', edad: 30 }; alerta (recuento (usuario)); // 2
Intente que el código sea lo más breve posible.
PD: Ignore las propiedades simbólicas, cuente sólo las "normales".
Abra una caja de arena con pruebas.
recuento de funciones (obj) { devolver Objeto.claves(obj).longitud; }
Abra la solución con pruebas en un sandbox.