我想通过定期删除空节点(很可能是每个偶数或奇数节点)来减小javascript数组的大小。使用内置的javascript或d3.js方法是否有一种简单有效的方法?
背景
对于数据驱动的浏览器内应用程序,我有一个数组,其索引表示水平时间范围内的单位。
初始时间刻度间隔是算法最佳猜测,但通常远离所有索引点都有与之关联的数据。实际上,根据找到的最小时间间隔,我经常可以识别出未使用元素的常规模式,这些元素可以完全删除而不会影响任何数据。
使用d3选择(忽略空元素)很容易将时间刻度映射到实际数据,但考虑到这些数组的大小以及它们传递的事实,早期删除似乎是有意义的。数据 存在的地方,它非常大(一棵树),因此删除可能最好是在原位进行,而不是通过创建新数组。
从数组文档(native和d3.js)中我看到了几种可能的方法,但对可兼容性问题和可能的副作用都有点谨慎。也许令人惊讶的是,我也没有发现与数组索引模式匹配相关的示例。
总结一下:
非常感谢
答案 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