将数组项复制到另一个数组中

IT技术 javascript arrays
2021-01-13 15:05:27

我有一个 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逐个添加项目?

6个回答

使用concat函数,如下所示:

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);

newArraywill的值[1, 2, 3, 4](arrayAarrayB保持不变;concat为结果创建并返回一个新数组)。

如何串联两个数组关于如何接受的答案推动相互转换?这是两种不同的操作。
2021-03-11 15:05:27
@WiseGuyEh 想象一下:function(stuff, toAdd) {stuff.push(toAdd);}这里没有办法使用concat这就是我所说的它们不可互换的意思。为什么我相信Array.prototype.push.apply(stuff, toAdd);是正确的答案。
2021-03-13 15:05:27
@kaqqao 因为push不会使一组值变平。concat达到了问题的要求。
2021-03-27 15:05:27
我同意高性能执行非常好。不CONCAT正是为了那个目的CONCAT到数组?所以它应该是标准的或者还有其他更好的事情与 concat 相关吗?并且它可能只是因为浏览器的 JS 引擎的错误实现或您在任何地方使用它而变慢?说不定哪天就修好了。我会选择代码可维护性而不是 hacky 速度优化。唔 ....
2021-03-29 15:05:27
此外,我只是对情况进行了基准测试:concat 与 push.apply。Google Chrome:fast (concat =winner), Opera:fast (concat = winner), IE: Firefoxslow ( concat = winner), :slow (push.apply =winner, 但比 Chrome 的 concat 慢 10 倍) ... 说到糟糕的 JS 引擎实现.
2021-03-30 15:05:27

如果您的数组不是很大(请参阅下面的警告),您可以使用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);

... 或push()通过使用允许多个参数的事实来模拟原始方法concat(),例如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]);
    }
};
@DamienÓCeallaigh:是的。这与回到 IE 6 甚至更早版本的浏览器都兼容。
2021-03-18 15:05:27
现在使用扩展运算符,这可以像这样简化 array.push(...array2);
2021-03-21 15:05:27
注意:newArray.push.apply(newArray, dataArray1);给出相同的Array.prototype.push.applay(newArray,dataArra1);
2021-04-01 15:05:27
这与旧浏览器兼容吗?
2021-04-09 15:05:27

在 ECMAScript 6 中,您可以使用Spread 语法

let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);

console.log(arr1)

Spread 语法适用于所有主要浏览器(IE11 除外)。有关当前的兼容性,请参阅此(不断更新的)兼容性表

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

注意:如果您需要第三个数组中的结果(因此不修改 arr1,因为最初的问题似乎需要),您可以执行 newArray = [...arr1, ...arr2]
2021-03-13 15:05:27
@robertmylne 展开运算符显然不会修改原始数组,而是创建了所有稀疏数组内容的新副本。
2021-03-25 15:05:27
类似于 concat 的功能,具有持久性(改变原始数组)的好处。
2021-03-31 15:05:27
顺便说一句,与将一个数组的内容复制到另一个数组的其他方法相比,这也非常快。
2021-04-07 15:05:27
如果您使用的是 TypeScript,也可以使用展开运算符。如果您的目标是 ES5,它将编译为newArray.apply(newArray, dataArray1).
2021-04-09 15:05:27

MDN找到了一种优雅的方式

var vegetables = ['parsnip', 'potato'];
var moreVegs = ['celery', 'beetroot'];

// Merge the second array into the first one
// Equivalent to vegetables.push('celery', 'beetroot');
Array.prototype.push.apply(vegetables, moreVegs);

console.log(vegetables); // ['parsnip', 'potato', 'celery', 'beetroot']

或者你可以使用spread operatorES6特性:

let fruits = [ 'apple', 'banana'];
const moreFruits = [ 'orange', 'plum' ];

fruits.push(...moreFruits); // ["apple", "banana", "orange", "plum"]
这不是问题的要求。问题是寻求一种每次创建新数组的方法,而不是修改旧数组。
2021-04-04 15:05:27

以下对我来说似乎最简单:

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

由于“push”接受可变数量的参数,因此您可以使用applypush函数方法来推送另一个数组的所有元素。它使用第一个参数(此处为“newArray”)作为“this”,将数组元素作为剩余参数构造一个 push 调用。

slice一个语句中的 获取第一个数组的副本,因此您不要修改它。

更新如果您使用的是切片可用的 javascript 版本,您可以将push表达式简化为:

newArray.push(...dataArray2)
在 MDN 中也提到此处作为“合并两个数组”的示例
2021-04-06 15:05:27