计算数组中的百分比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)复杂度,并且可以轻松调整以返回最终数组。