Javascript:通过索引模式从大型数组中删除空元素

时间:2013-06-11 09:33:11

标签: javascript arrays d3.js

我想通过定期删除空节点(很可能是每个偶数或奇数节点)来减小javascript数组的大小。使用内置的javascript或d3.js方法是否有一种简单有效的方法?

背景

对于数据驱动的浏览器内应用程序,我有一个数组,其索引表示水平时间范围内的单位。

初始时间刻度间隔是算法最佳猜测,但通常远离所有索引点都有与之关联的数据。实际上,根据找到的最小时间间隔,我经常可以识别出未使用元素的常规模式,这些元素可以完全删除而不会影响任何数据。

使用d3选择(忽略空元素)很容易将时间刻度映射到实际数据,但考虑到这些数组的大小以及它们传递的事实,早期删除似乎是有意义的。数据 存在的地方,它非常大(一棵树),因此删除可能最好是在原位进行,而不是通过创建新数组。

从数组文档(native和d3.js)中我看到了几种可能的方法,但对可兼容性问题和可能的副作用都有点谨慎。也许令人惊讶的是,我也没有发现与数组索引模式匹配相关的示例。

总结一下:

  1. 要删除的节点遵循模式(每第2个节点等)
  2. 这些节点保证为空。
  3. 没有进一步的依赖(jQuery等)谢谢。
  4. 非常感谢

1 个答案:

答案 0 :(得分:0)

你可以“手动”或使用过滤功能。

过滤功能更快......写:

function isEmptyNode(x, i ) { return ( i & 1 ) } ;   // to keep odd nodes

var myNewArray = myOldArray.filter(isEmptyNode) ; 

...但是好的旧循环(就地)方式更快:

var dst=0;
for (var i=0, len=myArray.length; i<len ; i++ ) { if (i & 1) myArray[dst++]=myArray[i] }
myArray.length = dst;

您可以轻松地将if (i & 1)更改为if (myTestFunction(i)),以获得更通用的过滤效果。

对于表演,你可以在这里检查一下for循环的速度要快100倍: http://jsperf.com/filter-odd-items-in-array/2