我想将多个元素作为一个数组推送,但是出现了错误:
> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
我希望做类似于在 Ruby 中所做的事情,我认为 apply
就像是 *
。
>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
我想将多个元素作为一个数组推送,但是出现了错误:
> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
我希望做类似于在 Ruby 中所做的事情,我认为 apply
就像是 *
。
>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
您可以通过以下方式将多个元素推入数组中
var a = [];
a.push(1, 2, 3);
console.log(a);
array1.push(...array2)
的操作,这与array1.push(array2[0], array2[1], array2[2])
完全相同,除了数组array2中元素数量的限制(约为100,000)。 - vantrung -cuncon现在在ECMAScript2015(也称为ES6)中,您可以使用展开运算符一次性添加多个项目:
var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);
参阅Kangax的ES6兼容性表格以查看浏览器的兼容情况。
a = []; b = []; for (let i = 0; i < 1000000; i++) { b.push(i); } a.push(...(b.slice(0, 130000)));
这确实给我造成了一个错误。"Uncaught RangeError: Maximum call stack size exceeded" 这个限制可能取决于数组中元素的大小,而不仅仅是元素的数量。这只是一个猜测。它可能取决于环境。也只是一个猜测。我还没有尝试查找文档。 - undefinedapply
或 call
函数调用对象的大多数函数时,context
参数必须是您正在处理的对象。a.push.apply(a, [1,2])
(或更正确地说是 Array.prototype.push.apply(a, [1,2])
)。作为其中一种替代方案,你可以使用Array.concat
:
var result = a.concat(b);
这会创建并返回一个新数组,而不是将项目推入同一数组。如果您不想修改源数组而是要制作一个浅拷贝副本,则这可能很有用。
Array.prototype.push.apply(arr1, arr2)
是正确的答案,因为使用 arr1.concat(arr2)
会创建一个新数组。 - suricactusarr1 = arr1.concat(arr2)
这并不是什么大不了的事情,看起来更加简洁。将新元素添加到旧数组中或者用新数组替换旧数组取决于你的需求。如果你处理的是超过1000万个元素的大数据,将新元素添加到旧数组中会更快一些;如果你处理的是比较小的数据块,速度上几乎没有区别。两种选择都是完全合法的。" - VisioNprototype.push.apply
只调用一次 push
方法。上面的区别不是关于速度,而是关于就地修改和创建新数组的区别。如果我有一个方法,它需要就地修改一个数组,那该怎么办呢?即使使用 VisionN 的代码,concat
方法也不可能起作用,因为它不会修改函数调用者的变量。 - coderforlifea = a.concat(b)
is still a shorter syntax than Array.prototype.push.apply(arr1, arr2)
- Aizzat SuhardiArray.push()
与扩展运算符一起:a = [1,2]
b = [3,4,5,6]
a.push(...b)
结果将是
a === [1,2,3,4,5,6]
Array.concat
方法的话,它和它一样不会修改数组,但会返回新的数组。你可以使用展开运算符来实现:
```javascript
[...arr1, ...arr2]
```
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或类似的转换器。
我曾有同样的疑问,在我的情况下,一个更简单的解决方案对我起了作用:
let array = []
array.push(1, 2, 4, "string", new Object())
console.log(array)
// logs [ 1, 2, 4, 'string', {} ]
function insert(array, index, obj) {
return [...array.slice(0,index), obj, ...array.slice(index)]
}
let arr = [1,2,3,4,5,7,8,9,0]
arr = insert(arr, 5, 6)
console.log(arr)
一次性推送多个对象通常取决于您如何声明数组
。
这是我的做法
//declaration
productList= [] as any;
现在 push
记录
this.productList.push(obj.lenght, obj2.lenght, items);
any
的提示。 - Ramon Dias
null
替换为a
,像这样:a.push.apply(a, [1,2])
。 - undefined