我试图对数组中的对象值求和,然后计算每个值相对于总数的百分比。
这里是数组:
[
{
"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();
}
});
};
我得到的总和是正确的。
建议?
预先感谢
答案 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();
}
});
};