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

认为apply类似于*

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


#1 楼

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

#2 楼

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




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

console.log(a); 




评论


此答案和选定的答案会产生不同的结果,可能会产生意想不到的结果。 a.push(1)与a.push([1])

– oevna
16 Dec 24'在1:12

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

–蓝色
19-09-17在14:49

@BluE如果要合并两个数组,只需使用array.concat()

–佛罗伦萨·阿兰迪斯
20-2-26在16:45

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

–蓝色
20-2-27在7:55



@BluE ES6现在允许您执行类似array1.push(... array2)的操作,该操作与array1.push(array2 [0],array2 [1],array2 [2])完全一样,但元素数量有所限制在array2中(大约100,000)

– vantrung -cuncon
20 Sep 6 '21:12



#3 楼

现在,在ECMAScript2015(也称为ES6)中,您可以使用传播运算符一次附加多个项目:




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





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

评论


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

–克里斯
16-2-15在17:40



谢谢!这真的对我有帮助

–未知
20/11/19在9:33

#4 楼

您可以使用Array.concat

var result = a.concat(b);


评论


Array.prototype.concat返回新数组。

–suricactus
15年8月21日在21:38

他想推送到现有数组,因此Array.prototype.push.apply(arr1,arr2)是正确的答案,因为使用arr1.concat(arr2)可以创建一个新数组。

–suricactus
15年8月21日在22:18

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

– VisioN
15年8月21日在22:47

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

–lifefor编码器
16 Sep 2 '16 at 14:58

a = a.concat(b)的语法仍然比Array.prototype.push.apply(arr1,arr2)短

– Aizzat Suhardi
17年7月7日在4:52

#5 楼

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




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





请注意,这与push方法不同,因为push方法会更改/修改数组。浏览器检查Kangax的兼容性表。

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

#6 楼

如果要添加多个项目,则必须使用扩展运算符
a = [1,2]
b = [3,4,5,6]
a.push(...b)

输出将是
a = [1,2,3,4,5,6]


#7 楼

建议使用许多答案:Array.prototype.push(a, b)。这是一种很好的方法,但是如果您有非常大的b,则将出现堆栈溢出错误(由于参数过多)。请注意此处。

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

评论


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

–mrun
18年4月4日在14:03

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

– 12kb
18-4-5在13:34



#8 楼

var a=[];
a.push({
 name_a:"abc",
 b:[]
});

a.b.push({
  name_b:"xyz"
});


#9 楼

一次推送多个对象通常取决于如何声明array
这就是我的做法
//declaration
productList= [] as  any;

现在push记录
this.productList.push(obj.lenght, obj2.lenght, items);