在javascript中将数组拼接成数组的更好方法

有没有比这更好的方式拼接到另一个数组在javascript中

var string = 'theArray.splice('+start+', '+number+',"'+newItemsArray.join('","')+'");'; eval(string); 

你可以使用apply来避免评估:

 var args = [start, number].concat(newItemsArray); Array.prototype.splice.apply(theArray, args); 

apply函数用于调用具有给定上下文和参数的另一个函数,以数组forms提供,例如:

如果我们打电话:

 var nums = [1,2,3,4]; Math.min.apply(Math, nums); 

apply函数将执行:

 Math.min(1,2,3,4); 

把它包装成一个函数,你得到这个:

 function insertArrayAt(array, index, arrayToInsert) { Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert)); } 

你会这样使用它:

 var arr = ["A", "B", "C"]; insertArrayAt(arr, 1, ["x", "y", "z"]); alert(JSON.stringify(arr)); // output: A, x, y, z, B, C 

你可以看看在这个jsFiddle: http : //jsfiddle.net/luisperezphd/Wc8aS/

如果你想要的东西几乎与splice方法相同,你也可以在Array原型中添加一个这样的函数。 例如

 Array.prototype.spliceArray = function(index, n, array) { return Array.prototype.splice.apply(this, [index, n].concat(array)); } 

那么用法就是:

 var array = ["A","B","C","","E","F"]; array.splice(3,1,"D"); // array is ["A","B","C","D","E","F"] array.spliceArray(3,3,["1","2","3"]); // array is ["A","B","C","1","2","3"] 

在这里看到它的行动: http : //jsfiddle.net/TheMadDeveloper/knv2f8bb/1/

一些说明:

  • splice函数直接修改数组,但是返回被移除的元素数组…不是拼接的数组。
  • 尽pipe通常不推荐扩展核心JavaScript类,但对于大多数标准框架而言,这是相对良性的。
  • 在使用专用数组类的情况下,扩展Array将不起作用,例如ImageData数据Uint8ClampedArray。

这个问题真的很老,但是在ES6中,使用扩展运算符有一个更简单的方法:

 sourceArray.splice(index, 0, ...insertedArray) 

如果您在浏览器中使用未编译的JavaScript,请确保在目标浏览器中支持https://kangax.github.io/compat-table/es6/#test-spread_(…)_operator 。


此外,这可能会有点偏离主题,但如果您不想或不需要修改原始数组,但可以使用新数组,请考虑以下方法:

 mergedArray = sourceArray.slice(0, index).concat(insertedArray, sourceArray.slice(index)) 

上面的答案涉及到splice.apply并将数组插入到一个单行列表中,这将导致大型数组堆栈溢出。 看到这里的例子: http : //jsfiddle.net/gkohen/u49ku99q/你可能需要切片,并推动插入的原始数组的其余部分的项目,使其工作。 看小提琴: http : //jsfiddle.net/gkohen/g9abppgy/26/

 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]); } } } 

我想有一个函数,将采取只有一部分源数组,所以我有我的略有不同基于CMS的答案

 function spliceArray(array, index, howmany, source, start, end) { var arguments; if( source !== undefined ){ arguments = source.slice(start, end); arguments.splice(0,0, index, howmany); } else{ arguments = [index, howmany]; } return Array.prototype.splice.apply(array, arguments) } Array.prototype.spliceArray = function(index, howmany, source, start, end) { return spliceArray(this, index, howmany, source, start, end); } 

你可以看到: https : //jsfiddle.net/matthewvukomanovic/nx858uz5/