我有一个这样的数组:
var data =
[
{label:1, quater :'Q1', y:34},
{label:2, quater:'Q1', y:20},
{label:3, quater:'Q1', y:30},
{label:1, quater:'Q2', y:77},
{label:2, quater:'Q2', y:52},
{label:3, quater:'Q2', y:3},
{label:1, quater:'Q3', y:65},
{label:2, quater:'Q3', y:12},
{label:3, quater:'Q3', y:9},
{label:1, quater:'Q4', y:77},
{label:2, quater:'Q4', y:34},
{label:3, quater:'Q4', y:5}
];
我的目标是在每个对象中添加“百分比”。每个“百分比”是当前对象中y值的百分比,由Q1到Q4的四分之一的y值之和除。例如,第一次投球的百分比应为34 /(34 + 77 + 65 + 77) 下面的代码是我尝试过的。它正确地工作和计算数据。我是javascript的新手,所以我逐步计算数据,使代码看起来很长。
我想知道什么是计算数据以使代码更短的更智能的方法?谢谢!
var quater = ["Q1","Q2","Q3","Q4"];
var sum = 0;
var arr = [];
for(var i = 0; i<quater.length; i++){
for(var j = 0; j<data.length; j++){
if (data[j]['quater'] == quater[i])
sum = sum + data[j]['y'];
}
//console.log(sum)
arr.push({
'quater': quater[i],
'sum': sum
})
sum = 0;
}
var arr1 = [];
var percent;
for(var i = 0; i<data.length;i++){
for(var j = 0; j<arr.length; j++){
if(data[i]['quater'] == arr[j]['quater']){
percent = data[i]['y']/arr[j]['sum'];
}
}
//console.log(percent)
arr1.push({
'label': data[i]['label'],
'y': data[i]['y'],
'quater': data[i]['quater'],
'percent': percent
});
}
console.log(arr1)
答案 0 :(得分:4)
可以创建一个简单的对象,其中quater
&#39;作为键,并将总和作为值。
然后再次迭代数组并计算百分比
var totals={};
data.forEach(function(item){
totals[item.quater] = (totals[item.quater] || 0 ) + item.y;
});
// totals now looks something like {Q3:18, Q1:16, Q4:66, Q1:12}
data.forEach(function(item){
item.percent = 100 * item.y / totals[item.quater];
});
假设label
不重要,例如代表年份。如果没有将标签,分隔符和quater
连接到对象键
编辑:我可能会倒退,需要label
作为键。 Approaach是相同的
答案 1 :(得分:1)
您可以更有效地使用forEach
或map
。第一个map
用于计算总计,第二个map
用于计算百分比。请参阅charlietfl的回答,他为我的答案打了个招呼,因为forEach
方法完全相同。
var data =
[
{label:1, quater :'Q1', y:34},
{label:2, quater:'Q1', y:20},
{label:3, quater:'Q1', y:30},
{label:1, quater:'Q2', y:77},
{label:2, quater:'Q2', y:52},
{label:3, quater:'Q2', y:3},
{label:1, quater:'Q3', y:65},
{label:2, quater:'Q3', y:12},
{label:3, quater:'Q3', y:9},
{label:1, quater:'Q4', y:77},
{label:2, quater:'Q4', y:34},
{label:3, quater:'Q4', y:5}
];
quartersum = {}
data.map(function(entry) {
quartersum[entry.label] = (quartersum[entry.label]||0) + entry.y
})
data.map(function(entry) {
entry.percent = entry.y / quartersum[entry.label] * 100;
document.write(JSON.stringify(entry) + '<br>')
})
答案 2 :(得分:1)
试试这个。
我只是按照同时推动对象的过程来计算百分比值。
rbind