各値のパーセンテージを取得しようとしています。入力:
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
}
}
]
私が試したこと:最初に合計を取得し、次に各値からパーセンテージを取得しようとしています。どんな解決策も歓迎します。
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);
}
}
}
さて、ShowList
内部オブジェクトは常に同じ構造を持つので、以下のコードを使用できます。(何らかの理由でスケーラビリティが必要な場合、またはプロパティを変更する場合は、Nina Scholzの回答の方が適しています)
まず、ループを開始しShowList
、各オブジェクトを取得します。
次に、を使用して、各オブジェクトのage
とgender
の値のみを含む配列を作成しObject.values()
ます。これらすべての値を合計し、年齢と性別の合計を取得
する.reduce
ために使用します。
ここでage
、gender
オブジェクトの各プロパティをループし、計算を行って%を取得します
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加