Skip to content
Advertisement

sum of same keys of an array objects to produce new object

I have an array object:

const data = [
  { label: 'P', value: 13 },
  { label: 'P', value: 7 },
  { label: 'Q', value: 15 },
  { label: 'Q', value: 8 },
  { label: 'Q', value: 1 },
  { label: 'R', value: 5 },
  { label: 'S', value: 6 }
]

I need to produce an object which keeps the sum of the value for each key. So,the output will be:

{P: 20, Q: 24, R: 5, S: 6}

I am struggling to generate the output.

const data = [
  { label: 'P', value: 13 },
  { label: 'P', value: 7 },
  { label: 'Q', value: 15 },
  { label: 'Q', value: 8 },
  { label: 'Q', value: 1 },
  { label: 'R', value: 5 },
  { label: 'S', value: 6 }
]

const customData = data.reduce((acc, cur) => {
    let common = acc.length > 0 && acc.filter(item => item.label === cur.label)
    if (common) {
        common.value += cur.value
    } else {
        
    }
    return acc
}, {})

console.log(customData)
// expected output {P: 20, Q: 24, R: 5, S: 6}

Advertisement

Answer

Check to see if the key exists. If it doesn’t set it to zero, and add the value to it. Otherwise add the value.

const data = [
  { label: 'P', value: 13 },
  { label: 'P', value: 7 },
  { label: 'Q', value: 15 },
  { label: 'Q', value: 8 },
  { label: 'Q', value: 1 },
  { label: 'R', value: 5 },
  { label: 'S', value: 6 }
]

const customData = data.reduce((acc, cur) => {

    // Destructure the label and value from the object
    const { label, value } = cur;

    // If the label isn't present as a key on
    // the accumulator, set its value to zero, and then
    // add the value from the current object,
    // otherwise just add the value.
    acc[label] = (acc[label] || 0) + value;

    return acc;

}, {})

console.log(customData);
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement