Llego un poco tarde a la fiesta, sin embargo, si necesita una solución más robusta y flexible, aquí está mi contribución. Si desea sumar solo una propiedad específica en un combo de objeto / matriz anidado, así como realizar otros métodos agregados, aquí hay una pequeña función que he estado usando en un proyecto de React:
var aggregateProperty = function(obj, property, aggregate, shallow, depth) {
if ((typeof obj !== 'object' && typeof obj !== 'array') || !property) {
return;
}
obj = JSON.parse(JSON.stringify(obj));
const validAggregates = [ 'sum', 'min', 'max', 'count' ];
aggregate = (validAggregates.indexOf(aggregate.toLowerCase()) !== -1 ? aggregate.toLowerCase() : 'sum');
if (shallow === true) {
shallow = 2;
} else if (isNaN(shallow) || shallow < 2) {
shallow = false;
}
if (isNaN(depth)) {
depth = 1;
}
var value = ((aggregate == 'min' || aggregate == 'max') ? null : 0);
for (var prop in obj) {
if (!obj.hasOwnProperty(prop)) {
continue;
}
var propValue = obj[prop];
var nested = (typeof propValue === 'object' || typeof propValue === 'array');
if (nested) {
if (prop == property && aggregate == 'count') {
value++;
}
if (shallow === false || depth < shallow) {
propValue = aggregateProperty(propValue, property, aggregate, shallow, depth+1);
} else {
continue;
}
}
if ((prop == property || nested) && propValue) {
switch(aggregate) {
case 'sum':
if (!isNaN(propValue)) {
value += propValue;
}
break;
case 'min':
if ((propValue < value) || !value) {
value = propValue;
}
break;
case 'max':
if ((propValue > value) || !value) {
value = propValue;
}
break;
case 'count':
if (propValue) {
if (nested) {
value += propValue;
} else {
value++;
}
}
break;
}
}
}
return value;
}
Es recursivo, no es ES6 y debería funcionar en la mayoría de los navegadores semi-modernos. Lo usas así:
const onlineCount = aggregateProperty(this.props.contacts, 'online', 'count');
Desglose de parámetros:
obj =
propiedad de un objeto o de una matriz = la propiedad dentro de los objetos / matrices anidados que desea realizar el método
agregado en agregado = el método agregado (suma, mínimo, máximo o recuento)
superficial = se puede establecer en verdadero / falso o un valor numérico
profundidad = debe dejarse nulo o indefinido (se usa para rastrear las devoluciones de llamada recursivas posteriores)
Shallow se puede utilizar para mejorar el rendimiento si sabe que no necesitará buscar datos profundamente anidados. Por ejemplo, si tuviera la siguiente matriz:
[
{
id: 1,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 2,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 3,
otherData: { ... },
valueToBeTotaled: ?
},
...
]
Si desea evitar recorrer la propiedad otherData ya que el valor que va a agregar no está anidado tan profundamente, puede establecer shallow en verdadero.