Javascript - 在另一个数组中插入一个数组

ic3*_*ic3 79 javascript arrays performance

在另一个数组中插入数组的更有效方法是什么.

a1 = [1,2,3,4,5];
a2 = [21,22];

newArray - a1.insertAt(2,a2) -> [1,2, 21,22, 3,4,5];
Run Code Online (Sandbox Code Playgroud)

如果a2数组很大,从性能的角度来看,使用splice迭代a2看起来有点糟糕.

谢谢.

nic*_*ckf 156

你可以splice结合使用一些apply技巧:

a1 = [1,2,3,4,5];
a2 = [21,22];

a1.splice.apply(a1, [2, 0].concat(a2));

console.log(a1); // [1, 2, 21, 22, 3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

在ES2015 +中,您可以使用扩展运算符来使其更好一些

a1.splice(2, 0, ...a2);
Run Code Online (Sandbox Code Playgroud)

  • @icCube:我刚刚运行了一个基准测试,将此方法与patrick的答案进行了比较.它以a1和a2开头,如示例所示,并将a2变量注入a1 10,000次(因此最终,你有一个包含20,005个元素的数组).这种方法采用:**81ms**,切片+ concat方法花了**156ms***(在Chrome 13上测试)*.当然,这伴随着标准的警告,在大多数情况下,易读性将比速度更重要. (10认同)
  • @nick:在chrome中,如果数组保存超过130000项,则"apply"将抛出stackoverflow异常.http://jsfiddle.net/DcHCY/也发生在jsPerf我相信FF和IE的阈值大约是500k (3认同)

use*_*716 13

一开始就错了.本来应该用concat().

var a1 = [1,2,3,4,5],
    a2 = [21,22],
    startIndex = 0,
    insertionIndex = 2,
    result;    

result = a1.slice(startIndex, insertionIndex).concat(a2).concat(a1.slice(insertionIndex));
Run Code Online (Sandbox Code Playgroud)

示例: http ://jsfiddle.net/f3cae/1/

这需要一个slice(0, 2)[文档]a1至索引,然后再执行0[文档]添加2到阵列中,然后使用a1再次取另一个[1,2]concat(a2),但是这一次开始通过端同一索引处.

a2如果您愿意,可以添加它:

示例: http ://jsfiddle.net/f3cae/2/

Array.prototype.injectArray = function( idx, arr ) {
    return this.slice( 0, idx ).concat( arr ).concat( this.slice( idx ) );
};

var a1 = [1,2,3,4,5];
var a2 = [21,22];

var result = a1.injectArray( 2, a2 );
Run Code Online (Sandbox Code Playgroud)

您可以使用[1,2][docs]方法而无需迭代.

var a1 = [1,2,3,4,5],
    a2 = [21,22],
    startIndex = 0,
    insertionIndex = 2,
    result;    

result = a1.slice(startIndex, insertionIndex).concat(a2).concat(a1.slice(insertionIndex));
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/f3cae/


Elm*_*mer 10

如果使用ES2015或更高版本,您现在可以执行此操作:

var a1 = [1,2,3,4,5];
var a2 = [21,22];
a1.splice(2, 0, ...a2);
console.log(a1) // => [1,2,21,22,3,4,5]
Run Code Online (Sandbox Code Playgroud)

有关spread(...)运算符的文档,请参阅此文件https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator