将多个元素推送到数组


284

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

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

我正在尝试做与红宝石中类似的事情,我当时以为apply是这样的*

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]

Answers:


240

当使用带有apply或的对象的大多数功能时callcontext参数必须是您正在处理的对象。

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


615

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

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

console.log(a);


1
该答案和选择的答案会产生不同的结果,也许是意料之外的结果。a.push(1)和a.push([1])
oevna

1
谁能解释,为什么投票数比接受的答案还要多?这可能更容易,但灵活性较差。如果要合并2个数组,则此方法将无效。
BluE

@BluE如果要合并两个数组,请使用array.concat()
Florent Arlandis

@FlorentArlandis array.concat无法将第二个数组添加到第一个。它将创建一个新的。我知道这是相似的。我一直在寻找价差操作员。只需查看其他答案和评论以了解详细信息。
BluE

434

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

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

请参阅Kangax的ES6兼容性表以查看兼容的浏览器


41
whaaaaaaat这太棒了,此外,如果您在打字稿中进行操作,它将编译为push.apply,因此具有向后兼容性
Chris

72

您可以使用Array.concat

var result = a.concat(b);

16
Array.prototype.concat返回新数组。
suricactus

12
他想推送到现有阵列,所以Array.prototype.push.apply(arr1, arr2)正确的答案是,因为使用arr1.concat(arr2)来创建新阵列。
suricactus

3
@suricactus arr1 = arr1.concat(arr2)没什么大不了,看起来更干净。推入旧阵列或用新阵列替换旧阵列取决于您的需求。如果处理10m +个元素,则推入旧数组的速度会更快,如果管理小的块,则几乎看不到速度上的任何差异。两种选择都是完全合法的。
2015年

5
@YuvalA。prototype.push.apply只打push一次。上面的区别在速度上不是必需的,而是就地操作与创建新数组的区别。如果我有一个采用数组并应该就地修改的方法该怎么办?concat即使使用VisionN的代码,该方法也可能无法工作,因为它不会为函数调用者修改变量。
coderforlife

1
a = a.concat(b)语法仍然比Array.prototype.push.apply(arr1, arr2)
Aizzat Suhardi '17

22

如果您想要Array.concatECMAScript 2015(又名ES6,ES2015)的替代方案,就像它一样,它不会修改数组而是返回一个新数组,则您可以使用散布运算符,如下所示:

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

请注意,这与push方法不同,因为该push方法会更改/修改数组。

如果要查看某些ES2015功能在浏览器中是否可用,请检查Kangax的兼容性表

如果不想等待浏览器支持并想在生产环境中使用ES2015,也可以使用Babel或类似的编译器。


4

建议使用许多答案:Array.prototype.push(a, b)。很好,但是如果您的b很大,则会出现堆栈溢出错误(由于参数过多)。小心点

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


3
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。[我如何写一个好的答案?](stackoverflow.com/help/how-to-answer
mrun

1
抱歉,由于声望不够高,我无法在评论下留下评论(我自己的评论除外):)。但这似乎应该在此处提及以具有完整的概述。你能帮我吗?然后,我将删除我的答案。
18kb

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.