计算数组javascript中的百分比

Use*_*403 2 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},

       {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}
    ];
Run Code Online (Sandbox Code Playgroud)

我的目标是在每个对象中添加“百分比”。每个“百分比”是当前对象中 y 值除以 Q1 到 Q4 的四分之一中 y 值之和的百分比。例如,第一个 boject 中的百分比应该是 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)
Run Code Online (Sandbox Code Playgroud)

cha*_*tfl 5

可以创建一个简单的对象,以quaters 作为键,将总和作为值。

然后再次迭代数组并计算百分比

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];
});
Run Code Online (Sandbox Code Playgroud)

假设label并不重要,例如代表年份。如果不连接 label 、 delimiter 和quater到对象键中

编辑:我可能有这个倒退并且需要label's 作为键。方法是一样的