Hay un buen método de matriz reduce()
para obtener un valor de la matriz. Ejemplo:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
¿Cuál es la mejor manera de lograr lo mismo con los objetos? Me gustaría hacer esto:
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
Sin embargo, Object no parece tener ningún reduce()
método implementado.
javascript
arrays
object
reduce
Pavel S.
fuente
fuente
Underscore.js
?reduce
método. Lo comprobaría allí. Sin embargo, la solución no parece tan difícil._
tiene una reducción para los objetos. No estoy seguro si funciona por accidente o si el soporte de objetos fue intencional, pero de hecho puede pasar un objeto como en el ejemplo de esta pregunta, y lo hará (conceptualmente)for..in
, llamando a su función de iterador con los valores encontrados en cada tecla.Respuestas:
Lo que realmente quieres en este caso son los
Object.values
. Aquí hay una implementación concisa de ES6 con eso en mente:o simplemente:
fuente
Una opción sería la de
reduce
lakeys()
:Con esto, querrá especificar un valor inicial o la primera ronda será
'a' + 2
.Si desea el resultado como un Objeto (
{ value: ... }
), deberá inicializar y devolver el objeto cada vez:fuente
@babel/plugin-proposal-object-rest-spread
complemento, extendí el valor del acumulador en Regreso de reducción y funciona a las mil maravillas, pero me pregunto si estoy haciendo algo mal, porque estaba pasando el objeto al valor inicial de reducción y su respuesta me demostró que hice lo correcto.Implementación de ES6: Object.entries ()
fuente
Object.entries(o); // returns [['value',1],['value',2],['value',3]]
function (total, pair)
afunction (total, [key, value])
entries
es una forma más limpia de hacerlokeys
, es menos eficiente. hackernoon.com/…En primer lugar, no entiendes cuál es el valor anterior de reducir .
En su pseudocódigo que tiene
return previous.value + current.value
, por lo tanto, elprevious
valor será un número en la próxima llamada, no un objeto.En segundo lugar,
reduce
es un método de matriz, no un objeto, y no puede confiar en el orden cuando está iterando las propiedades de un objeto (consulte: https://developer.mozilla.org/en-US/docs/ JavaScript / Referencia / Declaraciones / para ... en , esto también se aplica a Object.keys ); así que no estoy seguro de sireduce
tiene sentido aplicar sobre un objeto.Sin embargo, si el pedido no es importante, puede tener:
O simplemente puede mapear el valor del objeto:
PS en ES6 con la sintaxis de la función de flecha gruesa (ya en Firefox Nightly), puede reducir un poco:
fuente
1:
2:
3:
fuente
Extiende Object.prototype.
Muestra de uso.
¡No, chicos! ;-)
fuente
Object.entries()
en 2021Puede usar una expresión generadora (admitida en todos los navegadores durante años y en Nodo) para obtener los pares clave-valor en una lista que puede reducir en:
fuente
Un objeto puede convertirse en una matriz con: Object.entries () , Object.keys () , Object.values () , y luego reducirse como matriz. Pero también puede reducir un objeto sin crear la matriz intermedia.
He creado una pequeña biblioteca auxiliar odict para trabajar con objetos.
Tiene una
reduce
función que funciona de manera muy similar a Array.prototype.reduce () :También puede asignarlo a:
¡ya que este método es muy útil!
Entonces la respuesta a su pregunta sería:
fuente
Si puede usar una matriz, use una matriz, la longitud y el orden de una matriz valen la mitad.
/ * valor devuelto: (Número) 6 * /
fuente
Esto no es muy difícil de implementar usted mismo:
En acción:
También puede agregarlo al prototipo de objeto:
fuente
Como todavía no se ha confirmado realmente en una respuesta, Underscore
reduce
también funciona para esto.Tenga en cuenta
_.reduce
que devolverá el único valor (objeto u otro) si el objeto de lista solo tiene un elemento, sin llamar a la función de iterador.fuente
Prueba esta función de flecha de línea
fuente
Prueba este. Se ordenarán los números de otras variables.
fuente