使用循环创建数据数组

时间:2018-07-13 19:05:44

标签: javascript charts chart.js

使用循环创建要使用ChartJS绘制的数据数组是否可以进行完整的生产?这是我正在做的事情。 https://jsfiddle.net/GodlyKong/n5u2wwjg/88341

var arr2 = [pmt,((1+r)*pmt)];
for (var i=1; i<n; i++){
  tata = Math.round ((1+r)*(pmt+arr2[i]));
  arr2.push (tata);
};
console.log(arr2);





var ctx = document.getElementById("Chart1");
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: arr,
        
         datasets: [{
            //function: function(x) { return (pmt/r)*(((1+r)**4)-1),
            data: arr2,
            backgroundColor: "rgba(34,30,31,1)",
            label: "Deductible"
        
        }]
    },
    //options: bar_stacked,
});

2 个答案:

答案 0 :(得分:0)

考虑到您的代码可以在O(n)的时间运行,我很肯定应该没问题,而且您不可能更快地执行此操作(因为您需要创建要绘制的每个点)。

除非图表是静态的(在某种意义上它不依赖于database数据或某种形式的用户交互),否则您将始终必须创建新的点,在这种情况下,您实际上一无所获可以做到。

最慢的步骤很可能是在charts.js部分上,该部分正在创建DOM节点,以便可以在屏幕上绘制图表。

另一种选择是将数组数据存储在locaStorage上并将其用作缓存,这样,如果用户再次点击此route,则首先要检查{{1 }},如果没有,您可以构建它。

在我看来,这太过分了,locaStorage构建和排列的时间复杂度很好,并且可以预期,即使是成千上万的积分也是如此。

答案 1 :(得分:0)

当然,这是填充数组的一种好方法。如果要使其运行更快一点,可以直接将tata的值分配给索引,而不用调用array.push

const arr2 = [pmt, ((1 + r) * pmt)];

for (let i = 1; i < n; i++) {
  arr2[i + 1] = Math.round((1 + r) * (pmt + arr2[i]));
}

在js中,数组是稀疏的。因此,您只需将值分配给索引而不是推送到数组即可。

如果您想使速度更快,并且可以从一开始就知道最终值,则可以向后迭代:

for (let i = endLength; i--;) {
  arr2[i] = // do calculations here
}