如何求和并正确计算百分比?

时间:2019-10-21 12:28:17

标签: javascript

我试图对数组中的对象值求和,然后计算每个值相对于总数的百分比。

这里是数组:

[
  {
    "ratiototale": [
      [
        {
          "0": "0.4-0.5",
          "1": 294
        },
        {
          "0": "0.6-0.7",
          "1": 2228
        }
      ]
    ]
  }
]

通过这种方式,我仅对第二个对象具有正确的百分比。

var getData = function () {
                $.ajax({
                    url: 'http://localhost:3000/ratio/grouped',
                    success: function (data) {
                        console.log(data[0].ratiototale[0]);

                        let somma = 0;
                        for (var key in data[0].ratiototale[0]) {
                            myChart.data.labels.push(data[0].ratiototale[0][key][0]);
                            //myChart.data.datasets[0].data.push(data[0].ratiototale[0][key][1]);
                            var relativo = data[0].ratiototale[0][key][1];
                            somma += relativo;
                            var relative = (relativo*100/somma);
                            myChart.data.datasets[0].data.push(relative)
                            //console.log(relative)
                        }
            console.log(data[0].ratiototale[0][key]);
                        //console.log(somma)
            console.log(relativo)


                        // re-render the chart
                        myChart.update();
                    }
                });
            };

我得到的总和是正确的。

建议?

预先感谢

4 个答案:

答案 0 :(得分:1)

您正在循环中更新图表。这意味着在执行循环的第一次迭代时,您将第一个值添加到总计中,然后从总计中计算出该百分比。但是,因为它是总数中的唯一值,所以它将是100%。

您需要首先获取所有值的总和,然后再次遍历这些值以计算每个值的百分比。

答案 1 :(得分:1)

U首先需要在一个单独的循环中获得总和:

//First calculate the overall sum
var somma = 0;
for (var key in data[0].ratiototale[0]) {
  somma += data[0].ratiototale[0][key][1];
}
//Then calculate the individual percentages of each data-point
for (var key in data[0].ratiototale[0]) {
  var relative = (data[0].ratiototale[0][key][1]*100/somma);
}

答案 2 :(得分:1)

您可以按如下方式使用.map来获取百分比数组,只有在计算1键的总和之后才能这样做:

let percentages = [];

function calc(data) {
  let somma = 0;
  for (var key in data[0].ratiototale[0]) {
    var relativo = data[0].ratiototale[0][key][1];
    somma += relativo;
  }
  percentages = data[0].ratiototale[0].map((key) => key[1]/somma * 100);
}
calc([{"ratiototale":[[{"0":"0.4-0.5","1": 294 },{"0":"0.6-0.7","1":2228}]]}]);
console.log(percentages);

答案 3 :(得分:1)

您需要先计算总和,然后再遍历元素以计算百分比。您可以使用Array.reduce,例如-

let somma = data[0].ratiototale[0].reduce((accumulator,currentVal)=> accumulator + currentVal["1"], 0);

然后循环计算百分比,例如-

var data = [
  {
    "ratiototale": [
      [
        {
          "0": "0.4-0.5",
          "1": 294
        },
        {
          "0": "0.6-0.7",
          "1": 2228
        }
      ]
    ]
  }
]

let somma = data[0].ratiototale[0].reduce((accumulator,currentVal)=> accumulator + currentVal["1"], 0);

for (var key in data[0].ratiototale[0]) {
  //myChart.data.datasets[0].data.push(data[0].ratiototale[0][key][1]);
  var relativo = data[0].ratiototale[0][key][1];
  console.log(relativo);
  var relative = (relativo*100/somma);
  console.log(relative);
}

因此,您的总体代码如下所示-

var getData = function () {
                $.ajax({
                    url: 'http://localhost:3000/ratio/grouped',
                    success: function (data) {
                        console.log(data[0].ratiototale[0]);

                        let somma = data[0].ratiototale[0].reduce((accumulator,currentVal)=> accumulator + currentVal["1"], 0);
                        for (var key in data[0].ratiototale[0]) {
                            myChart.data.labels.push(data[0].ratiototale[0][key][0]);
                            //myChart.data.datasets[0].data.push(data[0].ratiototale[0][key][1]);
                            var relativo = data[0].ratiototale[0][key][1];
                            var relative = (relativo*100/somma);
                            myChart.data.datasets[0].data.push(relative)
                            //console.log(relative)
                        }
                        // re-render the chart
                        myChart.update();
                    }
                });
            };