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

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

a1 = [1,2,3,4,5]; a2 = [21,22]; newArray - a1.insertAt(2,a2) -> [1,2, 21,22, 3,4,5]; 

如果a2数组很大,则从性能的angular度来看,使用拼接对a2进行迭代看起来有点夸张。

谢谢。

你可以使用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]; 

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

 a1.splice(2, 0, ...a2); 

起初是错的 应该使用concat()来代替。

 var a1 = [1,2,3,4,5]; var a2 = [21,22]; var result = a1.slice( 0, 2 ).concat( a2 ).concat( a1.slice( 2 ) ); 

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

这需要a1slice() [docs]直到索引,然后执行concat() [docs]a2添加到该数组,然后再次使用.concat()再次获取a1另一个.slice()时间从同一个索引开始。

如果你愿意,可以将它添加到Array.prototype

例如: 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 ); 

您可以使用splice() [docs]方法而不进行迭代。

 a1.splice( 2, 0, a2 ); 

http://jsfiddle.net/f3cae/

如果使用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] 

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

我想find一种方法来做到这一点与splice()并没有迭代: http : //jsfiddle.net/jfriend00/W9n27/ 。

 a1 = [1,2,3,4,5]; a2 = [21,22]; a2.unshift(2, 0); // put first two params to splice onto front of array a1.splice.apply(a1, a2); // pass array as arguments parameter to splice console.log(a1); // [1, 2, 21, 22, 3, 4, 5]; 

通用functionforms:

 function arrayInsertAt(destArray, pos, arrayToInsert) { var args = []; args.push(pos); // where to insert args.push(0); // nothing to remove args = args.concat(arrayToInsert); // add on array to insert destArray.splice.apply(destArray, args); // splice it in } 

如果你想插入另一个数组而不创build一个新的数组,最简单的方法是使用pushunshiftapply

例如:

 a1 = [1,2,3,4,5]; a2 = [21,22]; // Insert a1 at beginning of a2 a2.unshift.apply(a2,a1); // Insert a1 at end of a2 a2.push.apply(a2,a1); 

这是unshift因为pushunshift带有可变数目的参数。 一个奖金,你可以很容易地select哪一端附加数组!

扩展运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的地方扩展expression式。

 a2 = [21,22]; a1 = [1,2,...a2,3,4,5];//...a2 is use of spread operator console.log(a1); 
 var a1 = [1,2,3,4,5]; var a2 = [21,22]; function injectAt(d, a1, a2) { for(var i=a1.length-1; i>=d; i--) { a1[i + a2.length] = a1[i]; } for(var i=0; i<a2.length; i++) { a1[i+d] = a2[i]; } } injectAt(2, a1, a2); alert(a1); 

这是我的版本没有特别的技巧:

 function insert_array(original_array, new_values, insert_index) { for (var i=0; i<new_values.length; i++) { original_array.splice((insert_index + i), 0, new_values[i]); } return original_array; } 

正如另一个线程中提到的,上面的答案在非常大的数组(200K元素)中不起作用。 请参阅这里涉及拼接和手动推送的备用答案: https : //stackoverflow.com/a/41465578/1038326

 Array.prototype.spliceArray = function(index, insertedArray) { var postArray = this.splice(index); inPlacePush(this, insertedArray); inPlacePush(this, postArray); function inPlacePush(targetArray, pushedArray) { // Not using forEach for browser compatability var pushedArrayLength = pushedArray.length; for (var index = 0; index < pushedArrayLength; index++) { targetArray.push(pushedArray[index]); } } }