let jsonData = {
  "status": true,
  "data": [
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Global",
      "esg_audited": "non-audited",
      "size": "large",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Global",
      "esg_audited": "audited",
      "size": "large",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Global",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 5
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Global",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 5
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Global",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Global",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 7
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "non-audited",
      "size": "large",
      "invoice_count": 7
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "non-audited",
      "size": "sme",
      "invoice_count": 23
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "large",
      "invoice_count": 3
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 13
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 5
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 2
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 4
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 4
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 1
    },
    {
      "year": 2021,
      "quarter": 4,
      "month": 12,
      "mthkey": 202112,
      "supplier": "root",
      "demography": "Local",
      "esg_audited": "audited",
      "size": "sme",
      "invoice_count": 2
    }
  ]
}
----------------------------------
  Function  
----------------------------------
  groupByMultis(data, keys,count_property_name) {
    const counts = {};
    data.forEach(item => {
      let currentLevel = counts;
      keys.forEach((key, index) => {
        const value = item[key];
        if (!currentLevel[value]) {
          currentLevel[value] = { count: 0 };
        }
        currentLevel[value].count += item[count_property_name];
        let val = parseFloat(parseFloat(currentLevel[value].count).toFixed(2));
        currentLevel[value].count = val;
        currentLevel = currentLevel[value];
      });
    });
    return counts;
  }
----------------------------------
  Use 
----------------------------------
  let groupByMultisResult = this.groupByMultis(jsonData.data,
                      ['esg_audited','demography','size'],'invoice_count');
----------------------------------
  Result 
----------------------------------
  {
  "non-audited": {
      "count": 101,
      "Global": {
          "count": 36,
          "large": {
              "count": 2
          },
          "sme": {
              "count": 34
          }
      },
      "Local": {
          "count": 65,
          "large": {
              "count": 14
          },
          "sme": {
              "count": 51
          }
      }
  },
  "audited": {
      "count": 147,
      "Global": {
          "count": 36,
          "large": {
              "count": 2
          },
          "sme": {
              "count": 34
          }
      },
      "Local": {
          "count": 111,
          "large": {
              "count": 28
          },
          "sme": {
              "count": 83
          }
      }
  }
}
  loopThroughObjRecurs (obj, count,propExec) {
    for (var k in obj) {
      if (typeof obj[k] === 'object' && obj[k] !== null) {
        let currentCount = obj[k].count;
        let percentage:any = (currentCount*100/count);
        let val = parseFloat(parseFloat(percentage).toFixed(2));
        obj[k]['percentage'] = val;
        this.loopThroughObjRecurs(obj[k], obj[k].count,propExec)
      } else if (obj.hasOwnProperty(k)) {
        propExec(k, obj[k])
      }
    }
  }
  let rootCount = _.sumBy(jsonData.data,'invoice_count');
  let withPercentage = loopThroughObjRecurs(groupByMultisResult,rootCount,
    function(k, prop) {
      //console.log(k + ': ' + prop);
    });

No comments:
Post a Comment