计算数组中的百分比javascript
我有这样一个数组:计算数组中的百分比javascript,javascript,Javascript,我有这样一个数组: 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},
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)
var-quater=[“Q1”、“Q2”、“Q3”、“Q4”];
var总和=0;
var-arr=[];
for(var i=0;i可以创建一个简单的对象,该对象将四分之一作为键,并将总和作为值
然后再次迭代数组并计算百分比
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
不重要,例如表示年份。如果不将label、delimiter和quater
连接到对象键中
编辑:我可能会将此项向后设置,并需要标签作为键。方法相同您可以使用forEach
或映射
更有效地实现此目的。第一个映射
用于计算总数,第二个映射
用于计算百分比。请参见charlietfl的回答,谁把我打败了answ呃,对于"代码"forEach,"代码"的方法,几乎是一样的
var数据=
[
{标签:1,四分之一:'Q1',y:34},
{标签:2,四分之一:'Q1',y:20},
{标签:3,四分之一:'Q1',y:30},
{标签:1,四分之一:'Q2',y:77},
{标签:2,四分之一:'Q2',y:52},
{标签:3,四元:'Q2',y:3},
{标签:1,四分之一:'Q3',y:65},
{标签:2,四分之一:'Q3',y:12},
{标签:3,四分之一:'Q3',y:9},
{标签:1,四分之一:'Q4',y:77},
{标签:2,四分之一:'Q4',y:34},
{标签:3,四分之一:'Q4',y:5}
];
四分之一和={}
data.map(函数(条目){
四分之一[entry.label]=(四分之一[entry.label]| | 0)+entry.y
})
data.map(函数(条目){
entry.percent=entry.y/四分之一[entry.label]*100;
document.write(JSON.stringify(条目)+'
')
})
试试这个
我只是在计算百分比值时,同时推动物体
<script>
var data =
[
{label:1, quarter :'Q1', y:34},
{label:2, quarter:'Q1', y:20},
{label:3, quarter:'Q1', y:30},
{label:1, quarter:'Q2', y:77},
{label:2, quarter:'Q2', y:52},
{label:3, quarter:'Q2', y:3},
{label:1, quarter:'Q3', y:65},
{label:2, quarter:'Q3', y:12},
{label:3, quarter:'Q3', y:9},
{label:1, quarter:'Q4', y:77},
{label:2, quarter:'Q4', y:34},
{label:3, quarter:'Q4', y:5}
];
var quater = ["Q1","Q2","Q3","Q4"];
var sum = 0;
var arr = [];
for(var i = 0; i<data.length; i++){
for(var j = 0; j<data.length; j++){
if (data[j]['quarter'] == quater[i])
sum = sum + data[j]['y'];
}
percent = data[i]['y']/sum;
//console.log(percent)
arr.push({
'label': data[i]['label'],
'y': data[i]['y'],
'quater': data[i]['quarter'],
'percent': percent
});
sum = 0;
}
console.log(arr);
</script>
var数据=
[
{标签:1,四分之一:'Q1',y:34},
{标签:2,四分之一:'Q1',y:20},
{标签:3,季度:'Q1',y:30},
{标签:1,四分之一:'Q2',y:77},
{标签:2,四分之一:'Q2',y:52},
{标签:3,四分之一:'Q2',y:3},
{标签:1,季度:'Q3',y:65},
{标签:2,四分之一:'Q3',y:12},
{标签:3,四分之一:'Q3',y:9},
{标签:1,季度:'Q4',y:77},
{标签:2,季度:'Q4',y:34},
{标签:3,季度:'Q4',y:5}
];
var quater=[“第一季度”、“第二季度”、“第三季度”、“第四季度”];
var总和=0;
var-arr=[];
对于(var i=0;我晚了3分钟,得出了完全相同的解决方案,但使用map而不是forEach hahaThis是不可思议的。我的代码与你的代码完全相同,一直到总计
和项目
名称。唯一的例外是乘以100-这在问题中有一些混淆,所以我将其省略了。)这是一个需要注意的大问题。还有一点空白的区别——我喜欢=
周围和括号内的空格,以及之间的空格。){
也是。只提到这些来说明差异是多么微小-看到我们编写了完全相同的代码,这是非常值得注意的。我认为这就是标准解决方案。:-)当你的算法工作时,它的复杂度是o(n^2)(你对每个条目迭代数组),之前给你的答案是o(n)复杂度,并且可以轻松调整以返回最终数组。