Javascript将数组值推入另一个数组

我有一个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,将值1加1?

使用concat函数,如下所示:

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

newArray的值将是[1, 2, 3, 4]arrayAarrayB保持不变; concat创build并返回结果的新数组)。

如果你的数组不是很大(见下面的警告),你可以使用你希望追加值的数组的push()方法。 push()可以接受多个参数,所以你可以使用它的apply()方法传递值的数组作为函数参数的列表。 这比使用concat()将数组添加到数组中而不是创build新数组具有优势。

但是,对于大型arrays(大约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); 

这是最后一个示例的基于循环的版本,适用于大型数组和所有主stream浏览器,包括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运算符尚未包含在所有主stream浏览器中。 有关当前的兼容性,请参阅此(不断更新) 兼容性表 。

但是,您可以使用Babel.js的扩展运算符。

从MDNfind一个优雅的方式

 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'] 

或者您可以使用ES6的spread operatorfunction:

 let fruits = [ 'apple', 'banana']; const moreFruits = [ 'orange', 'plum' ]; fruits.push(...moreFruits); // ["apple", "banana", "orange", "plum"] 
 var a=new Array('a','b','c'); var b=new Array('d','e','f'); var d=new Array('x','y','z'); var c=a.concat(b,d) 

这能解决你的问题吗?

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

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

由于“push”采用可变数量的参数,因此可以使用push函数的apply方法来推送另一个数组的所有元素。 它构造了一个调用,使用它的第一个参数(这里是“newArray”)作为“this”和数组的元素作为剩余的参数。

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

使用JavaScript ES6,您可以使用…运算符作为展开运算符,它将本质上将数组转换为值。 那么,你可以做这样的事情:

 var myArray = [1,2,3,4,5]; var moreData = [6,7,8,9,10]; myArray = [ ...myArray, ...moreData, ]; 

虽然语法简洁,但我不知道内部是如何工作的,以及大型数组的性能影响。

有几个关于Array.prototype.push.apply的解答。 这是一个明确的例子:

 var dataArray1 = [1, 2]; var dataArray2 = [3, 4, 5]; var newArray = [ ]; Array.prototype.push.apply(newArray, dataArray1); // newArray = [1, 2] Array.prototype.push.apply(newArray, dataArray2); // newArray = [1, 2, 3, 4, 5] console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5] 

下面的函数对于数组长度没有问题,并且比所有build议的解决scheme执行得更好:

 function pushArray(list, other) { var len = other.length; var start = list.length; list.length = start + len; for (var i = 0; i < len; i++ , start++) { list[start] = other[i]; } } 

不幸的是,jspref拒绝接受我的提交,所以在这里他们是使用benchmark.js的结果

  Name | ops/sec | ± % | runs sampled for loop and push | 177506 | 0.92 | 63 Push Apply | 234280 | 0.77 | 66 spread operator | 259725 | 0.40 | 67 set length and for loop | 284223 | 0.41 | 66 

哪里

for循环和推送是:

  for (var i = 0, l = source.length; i < l; i++) { target.push(source[i]); } 

按下应用:

 target.push.apply(target, source); 

传播运营商:

  target.push(...source); 

最后“设置长度和循环”是上述function

我们有两个数组a和b。 这里的代码是什么数组是一个值被推入数组b。

 let a = [2, 4, 6, 8, 9, 15] function transform(a) { let b = ['4', '16', '64'] a.forEach(function(e) { b.push(e.toString()); }); return b; } transform(a) [ '4', '16', '64', '2', '4', '6', '8', '9', '15' ] 

这是一个工作代码,它工作正常:

 var els = document.getElementsByTagName('input'), i; var invnum = new Array(); var k = els.length; for(i = 0; i < k; i++){invnum.push(new Array(els[i].id,els[i].value))} 

而不是push()函数为IE使用concat函数。 例,

 var a=a.concat(a,new Array('amin')); 

最简单的:

 var newArray = dataArray1.slice(0);