使用循环创建要使用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,
});
答案 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
}