0

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

背景

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

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

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

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

总结一下:

  1. 要删除的节点遵循某种模式(每个第二个节点等)
  2. 这些节点保证为空。
  3. 没有其他依赖项(jQuery 等)谢谢。

非常感谢

4

1 回答 1

0

您可以“手动”完成,也可以使用过滤器功能。

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

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

var myNewArray = myOldArray.filter(isEmptyNode) ; 

...但是旧的 for 循环(就地)要快得多:

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)by aif (myTestFunction(i))以进行更通用的过滤。

对于表演,你可以在这里检查它是否比 for 循环快 100 倍:http: //jsperf.com/filter-odd-items-in-array/2

于 2013-06-11T10:13:54.280 回答