我正在使用Dygraph并实施了一个重新加载器,当用户放大图表时会添加更高分辨率的数据。
为了保持原始文件的边界,我保留原始数据并按照相应的缩放间隔插入新加载的数据,如下所示:
function spliceAndInject(my_graph_gadget, my_hi_res_data_dict) {
...
for (i = 0, len = current_data_set.length; i < len; i += 1) {
point = current_data_set[i];
// NOTE: a point = [time_in_milliseconds, value_for_graph]
timer = point[0];
if (timer < lower_bound || timer > higher_bound) {
new_data_set.push(point);
} else if (is_injected === undefined) {
is_injected = true;
new_data_set = new_data_set.concat(hi_res_data_set);
}
}
...
}
我想知道这是否可以更快地完成,因为我携带的数据越多,图形渲染速度就越慢。
问题:
用另一个数组替换数组的一部分的最快方法是什么?
谢谢!
答案 0 :(得分:1)
如果您事先知道索引并希望修改数据,那么使用原生splice
方法可能是最好的 - 尽管为了优化性能,您需要测试针对手动执行移动的手写解决方案。
如果你想创建一个新数组,我会用它:
var len = current_data_set.length,
new_data_set = new Array(len);
for (var i=0; i<len; i++)
var point = current_data_set[i];
if (point[0] < lower_bound)
new_data_set[i] = point;
else
break;
for (var j=i, k=0, l=hi_res_data_set.length; k<l; k++)
new_data_set[j++] = hi_res_data_set[k];
for (; i<len; i++)
if (current_data_set[i][0] > higher_bound)
break;
for (; i<len; i++)
new_data_set[j++] = current_data_set[i];
我认为这比你的更快,因为
concat
lower_bound
和higher_bound
is_injected
变量(如果有的话,应该静态地输入一个布尔值),其唯一目的是跳过循环部分