我有一个 JavaScript 数组dataArray
,我想将其推入一个新的数组newArray
。除了我不希望newArray[0]
成为dataArray
。我想将所有项目推入新数组:
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
甚至更好:
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);
所以现在新数组包含各个数据数组的所有值。有没有类似pushValues
简写,所以我不必迭代每个dataArray
,逐个添加项目?
使用concat函数,如下所示:
var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);
newArray
的值为[1, 2, 3, 4]
( arrayA
和arrayB
保持不变; concat
为结果创建并返回一个新数组)。
如果您的数组不是很大(请参阅下面的警告),您可以使用要push()
的数组的push()
方法。 push()
可以使用多个参数,因此您可以使用其apply()
方法将要推送的值数组作为函数参数列表进行传递。这比使用concat()
在数组中添加元素而不是创建新数组更有优势。
但是,似乎对于大型阵列(大约 100,000 个成员或更多), 这个技巧可能会失败 。对于这样的数组,使用循环是一种更好的方法。有关详细信息,请参阅https://stackoverflow.com/a/17368101/96100 。
var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);
您可能希望将其概括为函数:
function pushArray(arr, arr2) {
arr.push.apply(arr, arr2);
}
... 或将其添加到Array
的原型中:
Array.prototype.pushArray = function(arr) {
this.push.apply(this, arr);
};
var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);
... 或者通过允许使用concat()
(如push()
允许多个参数的事实允许多个参数来模拟原始的push()
方法:
Array.prototype.pushArray = function() {
this.push.apply(this, this.concat.apply([], arguments));
};
var newArray = [];
newArray.pushArray(dataArray1, dataArray2);
这是最后一个示例的基于循环的版本,适用于大型数组和所有主流浏览器,包括 IE <= 8:
Array.prototype.pushArray = function() {
var toPush = this.concat.apply([], arguments);
for (var i = 0, len = toPush.length; i < len; ++i) {
this.push(toPush[i]);
}
};
我将再添加一个 “面向未来” 的回复
在 ECMAScript 6 中,您可以使用spread 运算符 :
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);
Spread 运算符尚未包含在所有主流浏览器中。有关当前兼容性,请参阅此(持续更新) 兼容性表 。
编辑:
有关性能的更多评论,请参阅下面的 Jack Giffin 回复。似乎 concat 仍然比 spread 运算符更好更快。