Search code examples
angularangular7angular8

Convert a List of Objects and convert into different format by comparing with same Id value


This is the list having data for different gender.

[
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 358,
    "s": 158,
    "gender": "M"
  },
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 328,
    "s": 258,
    "gender": "F"
  },
  {
    "ageCode": 3,
    "ageDesc": "15-59",
    "q": 525,
    "s": 125,
    "gender": "M"
  },
  {
    "agCode": 4,
    "ageDesc": "60+",
    "q": 458,
    "s": 358,
    "gender": "F"
  }
]

The above list need to combine to the below list based on the ageCode is same. It need to merge the 2 objects where ageCode is same. The converted list look like below.

[
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "qM": 358,
    "sM": 158,
    "qF": 328,
    "sF": 258
  }
  {
    "ageCode": 3,
    "ageDesc": "15-59",
    "qM": 525,
    "sM": 125
  },
  {
    "agCode": 4,
    "ageDesc": "60+",
    "qF": 458,
    "sF": 358
  }
]

Solution tried:

  for(let item  of this.ageData) {
        if (this.ageData.find((i) => { i.agCode=== item.agCode})){

//}

    }

Here issues like duplicate and multiple for loop is required, Is there any efficient way to achieve this.


Solution

  • Please try next.

    const data = [
      {
        "ageCode": 1,
        "ageDesc": "0-4",
        "q": 358,
        "s": 158,
        "gender": "M"
      },
      {
        "ageCode": 1,
        "ageDesc": "0-4",
        "q": 328,
        "s": 258,
        "gender": "F"
      },
      {
        "ageCode": 3,
        "ageDesc": "15-59",
        "q": 525,
        "s": 125,
        "gender": "M"
      },
      {
        "ageCode": 4,
        "ageDesc": "60+",
        "q": 458,
        "s": 358,
        "gender": "F"
      }
    ];
    
    const combined = Object.values(data.reduce((result, item) => {
    if (!result[item.ageCode]) {
      result[item.ageCode] = {ageCode: item.ageCode, ageDesc: item.ageDesc};
    }
    result[item.ageCode]['s' + item.gender] = item.s;
    result[item.ageCode]['q' + item.gender] = item.q;
    return result;
    }, {}));
    
    console.log(combined);
    

    in case if you need sum up the numbers use the next thing:

        result[item.ageCode]['s' + item.gender] = result[item.ageCode]['s' + item.gender] ? result[item.ageCode]['s' + item.gender] + item.s : item.s;
        result[item.ageCode]['q' + item.gender] = result[item.ageCode]['q' + item.gender] ? result[item.ageCode]['q' + item.gender] + item.q : item.q;
    

    and the way back

    const combined = [
      {
        "ageCode": 1,
        "ageDesc": "0-4",
        "qM": 358,
        "sM": 158,
        "qF": 328,
        "sF": 258
      },
      {
        "ageCode": 3,
        "ageDesc": "15-59",
        "qM": 525,
        "sM": 125
      },
      {
        "ageCode": 4,
        "ageDesc": "60+",
        "qF": 458,
        "sF": 358
      }
    ];
    
    const original = combined.reduce((result, item) => {
      if (item.qM !== undefined) {
        result.push({
          "ageCode": item.ageCode,
          "ageDesc": item.ageDesc,
          "q": item.qM,
          "s": item.sM,
          "gender": "M"
        });
      }
      if (item.qF !== undefined) {
        result.push({
          "ageCode": item.ageCode,
          "ageDesc": item.ageDesc,
          "q": item.qF,
          "s": item.sF,
          "gender": "F"
        });
      }
      return result;
    }, []);
    
    console.log(original);