Search code examples
javascriptarraysjsonmapreduce

JSON to match key/values and get the total values for each key


I need help displaying a total of sessionTime to every goalName from an api I have created. I have tried mapping and reducing but was only able to get the total sessionTime.

I expect the results to come like this:
Learn Italian : 6
Parla con il mio amico in Italiano : 1

"records": [
    {
      "sessionTime": 1,
      "goalName": "Learn Italian",
      "timeStapmed": "10:08:23",
      "date": "11/08/2021",
      "id": 1
    },
    {
      "sessionTime": 5,
      "goalName": "Learn Italian",
      "id": "PFKFKZ",
      "timeStapmed": "10:14:48",
      "date": "11/08/2021"
    },
    {
      "sessionTime": 1,
      "goalName": "Parla con il mio amico in italiano",
      "id": "aP_g1-",
      "timeStapmed": "10:21:28",
      "date": "11/08/2021"
    }
  ]

Solution

  • I think you're looking for an array#reduce loop,

    records.reduce(
      (acc, { sessionTime, goalName }) =>
        acc?.[goalName]
          ? { ...acc, [goalName]: acc[goalName] + sessionTime }
          : { ...acc, [goalName]: sessionTime },
      {}
    );
    

    we can go though each object and keep a sum of their values in the acc variable.

    Full code:

    let records = [
      {
        sessionTime: 1,
        goalName: "Learn Italian",
        timeStapmed: "10:08:23",
        date: "11/08/2021",
        id: 1,
      },
      {
        sessionTime: 5,
        goalName: "Learn Italian",
        id: "PFKFKZ",
        timeStapmed: "10:14:48",
        date: "11/08/2021",
      },
      {
        sessionTime: 1,
        goalName: "Parla con il mio amico in italiano",
        id: "aP_g1-",
        timeStapmed: "10:21:28",
        date: "11/08/2021",
      },
    ];
    
    
    let newRecords = records.reduce((acc, {sessionTime, goalName}) => acc?.[goalName] ? {...acc, [goalName]: acc[goalName] + sessionTime} : {...acc, [goalName]: sessionTime}, {})
    
    console.log(newRecords)