将多个元素推送到数组

evf*_*qcg 249 javascript

我试图将多个元素作为一个数组推送,但是会出错

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
Run Code Online (Sandbox Code Playgroud)

我正在尝试做类似于我在红宝石中所做的事情,我觉得这就apply像是*.

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
Run Code Online (Sandbox Code Playgroud)

小智 572

您可以通过以下方式将多个元素推送到数组中

var a = [];
    
a.push(1, 2, 3);

console.log(a);
Run Code Online (Sandbox Code Playgroud)

  • @BluE ES6 现在允许您执行类似 ```array1.push(...array2)``` 的操作,其工作方式与 ```array1.push(array2[0], array2[1], array2[2] 完全相同])``` 除了 array2 中元素数量的限制(大约 100,000) (6认同)
  • 谁能解释一下,为什么这比接受的答案有更多的票数?它可能更容易,但灵活性较差。如果你想合并两个数组,这是行不通的。 (3认同)
  • @BluE如果你想合并两个数组只需使用 array.concat() (2认同)
  • @FlorentArlandis array.concat 无法将第二个数组添加到第一个数组。它将创建一个新的。我知道这是相似的。扩展运算符就是我一直在寻找的。只需查看其他答案和评论即可了解详细信息。 (2认同)

can*_*nac 375

现在在ECMAScript2015(又名ES6)中,您可以使用spread运算符一次追加多个项目:

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);
Run Code Online (Sandbox Code Playgroud)

请参阅Kangax的ES6兼容性表,了解哪些浏览器兼容

  • whaaaaaaat这很棒,另外,如果你在打字稿中这样做,它会编译成push.apply,所以你有向后兼容性 (38认同)
  • 这有数组大小限制。尝试使用大数组。你会得到例外。 (3认同)

Nie*_*sol 218

当使用带有apply或的对象的大多数函数时call,context参数必须是您正在处理的对象.

在这种情况下,您需要a.push.apply(a, [1,2])(或更正确Array.prototype.push.apply(a, [1,2]))

  • 对于ES6,请参阅@ canac的答案:http://stackoverflow.com/a/35167699/747749 (21认同)

Vis*_*ioN 63

你可以使用Array.concat:

var result = a.concat(b);
Run Code Online (Sandbox Code Playgroud)

  • Array.prototype.concat返回新数组. (14认同)
  • 他想推送到现有数组,所以`Array.prototype.push.apply(arr1,arr2)`是正确答案,因为使用`arr1.concat(arr2)`你正在创建一个新数组. (10认同)
  • @YuvalA.`prototype.push.apply`只调用一次`push`.并且上述区别对于速度而言不是必需的,而是对于创建新阵列的就地操作.如果我有一个采用数组并且应该就地修改它的方法怎么办?即使使用VisionN的代码,`concat`方法也不可行,因为它不会修改函数调用者的变量. (5认同)
  • @suricactus`arr1 = arr1.concat(arr2)`并不是什么大不了的事情,看起来更干净.推送旧阵列或用新阵列替换旧阵列取决于您的需求.如果你处理10m +元素推进旧阵列将更快地工作,如果你管理小块你几乎找不到速度的任何差异.两种选择都完全合法. (3认同)

Nik*_*dav 36

如果要添加多个项目,则必须使用扩展运算符

a = [1,2]
b = [3,4,5,6]
a.push(...b)
Run Code Online (Sandbox Code Playgroud)

输出将是

a = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 17

如果你想Array.concat在ECMAScript 2015(又名ES6,ES2015)中替代它,像它一样,不修改数组但返回一个新数组,你可以使用扩展运算符,如下所示:

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);
Run Code Online (Sandbox Code Playgroud)

请注意,这与push方法不同,因为push方法会变异/修改数组.

如果您想查看浏览器中是否有某些ES2015功能,请查看Kangax的兼容性表.

如果您不想等待浏览器支持并希望在生产中使用ES2015,也可以使用Babel或类似的转换程序.


12k*_*2kb 6

有很多答案推荐使用:Array.prototype.push(a, b). 这是一个很好的方法,但是如果你的 b 真的很大,你就会有堆栈溢出错误(因为参数太多)。这里要小心。

请参阅连接 N 个数组的最有效方法是什么?更多细节。

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论。【如何写出好的答案?](https://stackoverflow.com/help/how-to-answer) (4认同)