1

I wanna sum the elements of an array, but not all. Let's say that my array is:

var example = [
                   {"id": 1, "value": 50, "active": true}, 
                   {"id": 2, "value": 70, "active": false}, 
                   {"id": 3, "value": 45, "active": true}, 
                   {"id": 4, "value": 50, "active": false}
               ];

What I need to do is sum just the values of the elements with "active":true.

There's a way to do that? Maybe is too simple, but right now, my brain is dead.

I'm using Javascript and AngularJs.

Thanx in advance.

parthivrshah
  • 558
  • 1
  • 6
  • 14

4 Answers4

3

You can use filter and reduce like so:

var a = [{"id": 1, "value": 50, "active": true}, {"id": 2, "value": 70, "active": false}, {"id": 3, "value": 45, "active": true}, {"id": 4, "value": 50, "active": false}]

var result = a.filter(o => o.active).reduce((acc, cur) => cur.value + acc, 0)

console.log(result)
Asleepace
  • 2,966
  • 1
  • 16
  • 29
1

You can just use reduce, using the fact that in a numeric context true = 1 and false = 0:

var a = [{"id": 1, "value": 50, "active": true}, {"id": 2, "value": 70, "active": false}, {"id": 3, "value": 45, "active": true}, {"id": 4, "value": 50, "active": false}]

var result = a.reduce((a, c) => a + c.value * c.active, 0)

console.log(result)

Or if you prefer, using the ternary operator:

var a = [{"id": 1, "value": 50, "active": true}, {"id": 2, "value": 70, "active": false}, {"id": 3, "value": 45, "active": true}, {"id": 4, "value": 50, "active": false}]

var result = a.reduce((a, c) => a + (c.active ? c.value : 0), 0)

console.log(result)
Nick
  • 123,192
  • 20
  • 49
  • 81
1

You can prefer a simple syntax...

var example = [{"id": 1, "value": 50, "active": true}, {"id": 2, "value": 70, "active": false}, {"id": 3, "value": 45, "active": true}, {"id": 4, "value": 50, "active": false}];
var sum = 0

example.forEach(function(item, index){
  if (item["active"] == true) sum += item["value"];
});

console.log(sum);
Gustavo Toro
  • 420
  • 4
  • 9
0

I suggest you to use lodash If you need operation on array or collection

import lodash in file where you want to use it

import _ from 'lodash';
// or
const _ = require('lodash');

Apply filter and sumBy

var example = [
 {"id": 1, "value": 50, "active": true}, 
 {"id": 2, "value": 70, "active": false},
 {"id": 3, "value": 45, "active": true}, 
 {"id": 4, "value": 50, "active": false}
];
//Filter all active value
const filterData = _.filter(example, "active");
// const filterData = [
//  {"id": 1, "value": 50, "active": true}, 
//  {"id": 3, "value": 45, "active": true}, 
// ];

//Sum all value filter data
const sum = _.sumBy(filterData, "value");

console.log(sum)
Ashok
  • 2,583
  • 1
  • 10
  • 18