Search code examples
javascriptlodash

Transform Array of object using Lodash groupby and map


Here is what I want to do, I want to take the following array and turn it into the array after it. Can anyone point me in the right direction?

Original Data

[{
        "FeatureId": 1,
        "District": "ANE",
        "Temperature": 206,
        "RelativeHumidity": 20,
        "WindSpeed": 5,
        "WindGust": 15
      },
      {
        "FeatureId": 1,
        "District": "ANE",
        "Temperature": 196,
        "RelativeHumidity": 19,
        "WindSpeed": 5,
        "WindGust": 15
      },
      {
        "FeatureId": 2,
        "District": "AMO",
        "Temperature": 203,
        "RelativeHumidity": 54,
        "WindSpeed": 9,
        "WindGust": 18
      },
      {
        "FeatureId": 2,
        "District": "AMO",
        "Temperature": 184,
        "RelativeHumidity": 46,
        "WindSpeed": 12,
        "WindGust": 18
      }]

My Desired Data :

[
  {
    "FeatureId": 1,
    "District": "ANE",
    "TemperatureTrend": [ 206, 196 ],
    "RelativeHumidityTrend": [ 20, 19 ],
    "WindSpeedTrend": [ 5, 5 ],
    "WindGustTrend": [ 15, 15 ]
  },
  {
    "FeatureId": 2,
    "District": "AMO",
    "TemperatureTrend": [ 203, 184 ],
    "RelativeHumidityTrend": [ 54, 46 ],
    "WindSpeedTrend": [ 9, 12 ],
    "WindGustTrend": [ 18, 18 ]
  },

]

I have tried combining groupby and map, but I was unable to resolve the issue. I was also unsure how to log the steps.


Solution

  • Lets use Array.prototype.reduce because it fit the purpose of what you are trying to do.

        const data = [{
            "FeatureId": 1,
            "District": "ANE",
            "Temperature": 206,
            "RelativeHumidity": 20,
            "WindSpeed": 5,
            "WindGust": 15
          },
          {
            "FeatureId": 1,
            "District": "ANE",
            "Temperature": 196,
            "RelativeHumidity": 19,
            "WindSpeed": 5,
            "WindGust": 15
          },
          {
            "FeatureId": 2,
            "District": "AMO",
            "Temperature": 203,
            "RelativeHumidity": 54,
            "WindSpeed": 9,
            "WindGust": 18
          },
          {
            "FeatureId": 2,
            "District": "AMO",
            "Temperature": 184,
            "RelativeHumidity": 46,
            "WindSpeed": 12,
            "WindGust": 18
          }]
    
    // we gonna create from scratch array and populate it
    const aggregatedData = data.reduce((memo, element) => {
      const featureId = element.FeatureId
    
      const elementIndex = memo.findIndex(el => el.FeatureId === featureId)
      if (elementIndex === -1) {
        memo.push({
          FeatureId: featureId,
          District: element.District,
          TemperatureTrend: [element.Temperature],
          RelativeHumidityTrend: [element.RelativeHumidity],
          WindSpeedTrend: [element.WindSpeed],
          WindGustTrend: [element.WindGust]
        })
      } else {
        memo[elementIndex].TemperatureTrend.push(element.Temperature)
        memo[elementIndex].RelativeHumidityTrend.push(element.RelativeHumidity)
        memo[elementIndex].WindSpeedTrend.push(element.WindSpeed)
        memo[elementIndex].WindGustTrend.push(element.WindGust)
      }
    
      return memo
    }, [])
    
    console.log(aggregatedData)
    

    You can check it in codepen