认为
apply
类似于*
。> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
#1 楼
当使用带有apply
或call
的对象的大多数功能时,context
参数必须是您正在处理的对象。#2 楼
您可以通过以下方式将多个元素推入数组 var a = [];
a.push(1, 2, 3);
console.log(a);
#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);
评论
此答案和选定的答案会产生不同的结果,可能会产生意想不到的结果。 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