javascript - 计算总值并使用该总值获得每个百分比值
问题描述
我正在尝试获取每个值的百分比。输入:
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
}
}
]
- 将年龄 285737 + 12217710 + 655187 + 9035930 + 927554 和性别 12467636 + 11872 + 17833279 相加。
- 在获得每个 . 即 (285737 / 总价值 //23122118) * 100
- 输出可以具有相同的 json 格式:
[{
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);
}
}
}
解决方案
您可以采用完整的动态方法并通过添加项目并返回部分来获取百分比值。
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; }
推荐阅读
- javascript - onclick="$('#id').toggle()" 不起作用,需要为 Chrome 旧版本重写
- java - 是否存在在没有 GC 的情况下使用的堆内存减少的情况,即没有 GC 事件的情况?
- php - 何时使用 MailChimp 单一或批量操作?
- java - 构造函数中带有@Value的FactoryBean?
- java - How to save path drawn on canvas as png
- mysql - mySQL:如何编写满足两个或多个条件的查询
- docker - Docker Swarm 错误响应
- javascript - 流体图像根据屏幕尺寸调整尺寸
- java - 多个 Jasper 使用键报告页码处理程序
- android - The app does not open on sauce labs cloud