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]
( arrayA
和arrayB
保持不变; 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 operator
function:
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);