Kedar Kulkarni
Kedar Kulkarni

Reputation: 115

calculate total value and get percentage value of each using that total value

I am trying to get percentage for each values. Input:

ShowList = [{
        age: {
            age_55_above: 285737,
            age_25_34: 12217710,
            age_unspecified: 655187,
            age_18_24: 9035930,
            age_45_54: 927554,
            …
        }
        gender: {
            male: 12467636,
            unspecified: 11872,
            female: 17833279
        }
    },
    {
        age: {
            age_55_above: 285237,
            age_25_34: 12227710,
            age_unspecified: 651187,
            age_18_24: 9135930,
            age_45_54: 9227554,
            …
        }
        gender: {
            male: 111467636,
            unspecified: 13872,
            female: 178344279
        }
    }
]
  1. Add total of age 285737 + 12217710 + 655187 + 9035930 + 927554 and gender 12467636 + 11872 + 17833279.
  2. After getting total find percentage for each . ie (285737 / total val //23122118) * 100
  3. Output can have the same json format :
[{
        age: {
            age_55_above: % val,
            age_25_34:  % val,
            age_unspecified:  % val,
            age_18_24:  % val,
            age_45_54:  % val,
            …
        }
        gender: {
            male:  % val,
            unspecified:  % val,
            female:  % val
        }
    },
    {
        age: {
            age_55_above:  % val,
            age_25_34:  % val,
            age_unspecified:  % val,
            age_18_24:  % val,
            age_45_54:  % val,
            …
        }
        gender: {
            male:  % val,
            unspecified:  % val,
            female:  % val
        }
    }
]

What I have tried : First I am trying to get total and then take out percentage from each value. Any solution is welcome.

for (var key in this.ShowsList) {
          for (var keyGender in this.ShowsList[key]) {
              total[key] = {};
              for (var keyVal in this.ShowsList[key][keyGender]) {
                total[key] = total[key] || {};
                total[key]["gender"] = total[key]["gender"] || 0;
                total[key]["age"] = total[key]["age"] || 0;
                if(this.ShowsList[key]["gender"][keyVal] != undefined){
                  total[key]["gender"] += this.ShowsList[key]["gender"][keyVal];
                }
                if(this.ShowsList[key]["age"][keyVal] != undefined){
                  total[key]["age"] += this.ShowsList[key]["age"][keyVal];
                }
                Obj[key] = Obj[key] || {};
                Obj[key][keyGender] = Obj[key][keyGender] || {};
                Obj[key][keyGender][keyVal] = Obj[key][keyGender][keyVal] || 0;
                // Logic to calculate percentage

                // Obj[key]["gender"][keyVal] = ((this.ShowsList[key]["gender"][keyVal]/ total[key]["gender"]) * 100);
// Obj[key]["age"][keyVal] = ((this.ShowsList[key]["age"][keyVal]/ total[key]["gender"]) * 100);

              }
          }
        }

Upvotes: 1

Views: 412

Answers (3)

Calvin Nunes
Calvin Nunes

Reputation: 6501

Well, since the ShowList inner objects will always have the same structure, you can use the code below. (If for some reason you need scalability or the properties change, then Nina Scholz answer can suit better)

First, start looping through ShowList, get each object.
Then, create an array with only the values of age and gender of each object, by using Object.values().
Use .reduce to sum all those values and get the total for age and gender.
Now, loop each property of age and gender objects and make the calculation to get %

let ShowList = [{
        age: {
            age_55_above: 285737,
            age_25_34: 12217710,
            age_unspecified: 655187,
            age_18_24: 9035930,
            age_45_54: 927554            
        },
        gender: {
            male: 12467636,
            unspecified: 11872,
            female: 17833279
        }
    },
    {
        age: {
            age_55_above: 285237,
            age_25_34: 12227710,
            age_unspecified: 651187,
            age_18_24: 9135930,
            age_45_54: 9227554,            
        },
        gender: {
            male: 111467636,
            unspecified: 13872,
            female: 178344279
        }
    }
]

var results = []

for (var i = 0; i < ShowList.length; i++){
  let currentObj = ShowList[i];
  
  let ageValues = Array.from(Object.values(currentObj.age))
  let genderValues = Array.from(Object.values(currentObj.gender))
  
  let totalAges = ageValues.reduce((a,b) => a + b, 0)
  let totalGender = genderValues.reduce((a,b) => a + b, 0)
  
  let newObj = {age: {}, gender: {}}
  
  for (let key in currentObj.age){
    newObj.age[key] = (currentObj.age[key] / totalAges) * 100 + " %"
  }
  
  for (let key in currentObj.gender){
    newObj.gender[key] = (currentObj.gender[key] / totalGender) * 100 + " %"
  }
  
  results.push(newObj)
}

console.log(results)

Upvotes: 1

Jaisa Ram
Jaisa Ram

Reputation: 1767

have a look at here:-

let ShowList = [
  {
    "age": {
      "age_55_above": 285737,
      "age_25_34": 12217710,
      "age_unspecified": 655187,
      "age_18_24": 9035930,
      "age_45_54": 927554
    },
    "gender": {
      "male": 12467636,
      "unspecified": 11872,
      "female": 17833279
    }
  },
  {
    "age": {
      "age_55_above": 285237,
      "age_25_34": 12227710,
      "age_unspecified": 651187,
      "age_18_24": 9135930,
      "age_45_54": 9227554
    },
    "gender": {
      "male": 111467636,
      "unspecified": 13872,
      "female": 178344279
    }
  }
]

let result = ShowList.map(function(item){
        let o = {};
        for(let key in item){// top level iteration
          o[key] = {}
          let sum = Object.keys(item[key]).reduce((a,b)=> a+item[key][b], 0) 
          for(let subkey in item[key]){// sub level iteration
            o[key][subkey] = (item[key][subkey]/sum)*100;
          }
        }
        return o;
      })


console.log(result)

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386654

You could take a complete dynamic approach and get the percent values by adding the items and return the parts.

function getPercent(object) {
    var entries = Object.entries(object),
        sum = entries.reduce((s, { 1: v }) => s + v, 0);

    return Object.assign({}, ...entries.map(([k, v]) => ({ [k]: v * 100 / sum })));
}

var data = [{ age: { age_55_above: 285737, age_25_34: 12217710, age_unspecified: 655187, age_18_24: 9035930, age_45_54: 927554 }, gender: { male: 12467636, unspecified: 11872, female: 17833279 } }, { age: { age_55_above: 285237, age_25_34: 12227710, age_unspecified: 651187, age_18_24: 9135930, age_45_54: 9227554 }, gender: { male: 111467636, unspecified: 13872, female: 178344279 } }],
    result = data.map(o => Object.assign(
        {},
        ...Object.entries(o).map(([k, v]) => ({ [k]: getPercent(v) }))
    ));

   console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 3

Related Questions