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

whe*_*hys 62 javascript arrays

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

var string = 'theArray.splice('+start+', '+number+',"'+newItemsArray.join('","')+'");';
eval(string);
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 129

您可以使用apply来避免eval:

var args = [start, number].concat(newItemsArray);
Array.prototype.splice.apply(theArray, args);
Run Code Online (Sandbox Code Playgroud)

应用功能用于调用另一个函数,与给定的上下文中和参数,作为数组提供,例如:

如果我们打电话:

var nums = [1,2,3,4];
Math.min.apply(Math, nums);
Run Code Online (Sandbox Code Playgroud)

apply函数将执行:

Math.min(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)

  • 虽然,事实证明我需要做Array.prototype.splice.apply(theArray,[start,number] .concat(newItemsArray)),因为所有参数,不仅仅是一些,必须在一个数组中. (4认同)
  • '[start,number] .concat(array)`模式的+1.这很漂亮 (3认同)
  • @Claudu 另一个绝妙的技巧是用 ```[]``` 替换 ```Array.prototype```。所以命令可以是:```[].splice.apply(theArray, [start, removeCount].concat(newItemsArray);``` (2认同)

Lui*_*rez 49

更新:ES6版本

如果您在ES6中编码,您可以使用"传播运营商"(...)

array.splice(index, 0, ...arrayToInsert);
Run Code Online (Sandbox Code Playgroud)

要了解有关扩展运算符的更多信息,请参阅mozilla文档.

'老'的ES5方式

如果你把最顶层的答案包装成一个函数你会得到这个:

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

你会像这样使用它:

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

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


und*_*ned 7

这个问题真的很旧,但是使用ES6,有一种更简单的方法可以使用spread运算符:

sourceArray.splice(index, 0, ...insertedArray)
Run Code Online (Sandbox Code Playgroud)

如果您在浏览器中使用未编译的javascript,请务必检查目标浏览器是否支持它,网址https://kangax.github.io/compat-table/es6/#test-spread_(...)_operator.


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

mergedArray = sourceArray.slice(0, index).concat(insertedArray, sourceArray.slice(index))
Run Code Online (Sandbox Code Playgroud)


The*_*per 6

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

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

那么用法就是:

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"]
Run Code Online (Sandbox Code Playgroud)

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

一些说明:

  • splice函数直接修改数组,但返回已删除的元素数组...而不是拼接数组.
  • 虽然通常不建议扩展核心javascript类,但这对大多数标准框架来说都是相对温和的.
  • Array在使用专用数组类的情况下,扩展将不起作用,例如ImageData数据Uint8ClampedArray.