协慌网

登录 贡献 社区

将数组项推送到另一个数组中

我有一个 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]arrayAarrayB保持不变; 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 运算符尚未包含在所有主流浏览器中。有关当前兼容性,请参阅此(持续更新) 兼容性表

但是,您可以将扩展运算符与Babel.js一起使用

编辑:

有关性能的更多评论,请参阅下面的 Jack Giffin 回复。似乎 concat 仍然比 spread 运算符更好更快。