在Javascript中用另一个数组替换数组的一部分的最快方法是什么?

时间:2014-08-26 14:13:10

标签: javascript arrays loops

我正在使用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);
    }
  }
  ...
}

我想知道这是否可以更快地完成,因为我携带的数据越多,图形渲染速度就越慢。

问题
用另一个数组替换数组的一部分的最快方法是什么?

谢谢!

1 个答案:

答案 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_boundhigher_bound
  • 测试所有积分
  • 它不使用那个奇怪的is_injected变量(如果有的话,应该静态地输入一个布尔值),其唯一目的是跳过循环部分