繁体   English   中英

计算数组javascript中的百分比

[英]Calculate percentage in array 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}
    ];

我的目标是在每个对象中添加“百分比”。 每个“百分比”是当前对象中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)

可以制作一个简单的对象,其quater为键,而总和为值。

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

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到对象键中

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

您可以使用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>') }) 

尝试这个。

在计算百分比值时,我只是遵循了同时推送对象的过程。

<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM