我正在寻找在不删除原始引用的情况下替换或添加到数组元素的最佳方法。这是设置:
var a = [], b = [], c, i, obj;
for ( i = 0; i < 100000; i++ ) { a[ i ] = i; b[ i ] = 10000 - i; }
obj.data_list = a;
现在我们想在不更改对 a 的引用的情况下将 b 连接到 a,因为它在 obj.data_list 中使用。这是一种方法:
for ( i = 0; i < b.length; i++ ) { a.push( b[ i ] ); }
这似乎是一种更简洁和 8 倍(在 V8 上)更快的方法:
a.splice.apply( a, [ a.length, 0 ].concat( b ) );
我发现这在迭代“就地”数组时很有用,并且不想在我去的时候触摸元素(一个好习惯)。我用初始参数开始一个新数组(我们称之为keep_list),然后添加我希望保留的元素。最后我用这个apply方法来快速替换截断的数组:
var keep_list = [ 0, 0 ];
for ( i = 0; i < a.length; i++ ){
if ( some_condition ){ keep_list.push( a[ i ] );
}
// truncate array
a.length = 0;
// And replace contents
a.splice.apply( a, keep_list );
这个解决方案有几个问题:
- V8 上的最大调用堆栈大小限制约为 50k
- 我还没有在其他 JS 引擎上测试过。
- 这个解决方案有点神秘
有没有人找到更好的方法?