TheDevGuy
TheDevGuy

Reputation: 703

Sum of certain values of object

I have to calculate a sum of certain object values ( not all )

I have this object :

let object = {a: 1, b: 4, c: 2, d: 3, e: 10}

I need to sum just the a, c, d, e values.

Actually I use this method which sums all the values and gives me 20, but I need to have 16.

Object.keys(object).reduce((sum, key) => sum + parseFloat(object[key] || 0), 0)

How can I do this sum ?

Upvotes: 0

Views: 107

Answers (5)

Mohamed Wagih
Mohamed Wagih

Reputation: 1466

I'll add my two cents to the thread for...in is awesome too xD

let object = {a: 1, b: 4, c: 2, d: 3, e: 10} 
let sum = 0;
const keys = ['a', 'c', 'd', 'e'];

for(let key in object) {
  if(keys.includes(key)) //or key === 'a' || key === 'c' ..
    sum += object[key];
}

console.log(sum);

Upvotes: 1

epascarello
epascarello

Reputation: 207557

To follow what you originally did, You should have an array of the keys and check to see if it is included before you add it.

const myObject = {a: 1, b: 4, c: 2, d: 3, e: 10}
const keys = ['a', 'c','d', 'e']

const entries = Object.entries(myObject)
const result = entries.reduce( (total, [key, value]) => (keys.includes(key) ? value : 0) + total, 0)

console.log(result)

smarter way is to loop over the keys

const myObject = {a: 1, b: 4, c: 2, d: 3, e: 10}
const keys = ['a', 'c','d', 'e']

const result = keys.reduce( (total, key) => (myObject[key] || 0) + total, 0)

console.log(result)

Upvotes: 1

Mitya
Mitya

Reputation: 34628

You could either declare the keys you want to sum (whitelist) or those you wish to omit (blacklist). I've used the latter approach here:

let object = {a: 1, b: 4, c: 2, d: 3, e: 10},
    ignore = ['b'],
    sum = Object.keys(object)
        .filter(key => !ignore.includes(key))
        .reduce((total, key) => total += object[key], 0);
console.log(sum); //16

Fiddle

Upvotes: 0

Jason
Jason

Reputation: 734

Your sum function is good as it is, you just need to apply a filter

Object.keys(object)
    .filter(key => key !== 'b')
    .reduce((sum, key) => sum + parseFloat(object[key] || 0), 0)

Or, if you want a whitelist

const validKeys = {
    a: true,
    b: false, // optional
    c: true,
    d: true,
    e: true
}

Object.keys(object)
    .filter(key => validKeys[key])
    .reduce((sum, key) => sum + parseFloat(object[key] || 0), 0)

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386868

You could take the wanted keys directly.

let object = {a: 1, b: 4, c: 2, d: 3, e: 10},
    keys = ['a', 'c', 'd', 'e'],
    result = keys.reduce((sum, key) => sum + (object[key] || 0), 0);

console.log(result);

Upvotes: 0

Related Questions