Reputation: 115
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
}
}
]
[{
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
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
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
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