在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/