Javascript Concat比堆栈允许的数组多
这就是我如何将多个数组合并为一个数组(它们只包含数字) 不幸的是,当数组的数量太大时,我会得到超过最大堆栈深度的值。如何控制VM在堆栈上推送的阵列数Javascript Concat比堆栈允许的数组多,javascript,arrays,Javascript,Arrays,这就是我如何将多个数组合并为一个数组(它们只包含数字) 不幸的是,当数组的数量太大时,我会得到超过最大堆栈深度的值。如何控制VM在堆栈上推送的阵列数 [].concat.apply([], arrayOfArrays) 功能测试(msg,f){ 控制台时间(msg) f() 控制台。时间结束(msg) } 函数conc(a){ 返回a.concat.apply([],a) } 功能推送(a){ var R=[] 对于(变量i=0;i
[].concat.apply([], arrayOfArrays)
功能测试(msg,f){
控制台时间(msg)
f()
控制台。时间结束(msg)
}
函数conc(a){
返回a.concat.apply([],a)
}
功能推送(a){
var R=[]
对于(变量i=0;i
结果为concat。应用:20ms,推送:80ms,concat循环:60ms
应用
快得多!但它仅限于堆栈大小。如何克服堆栈限制以保持性能?假设阵列法拉利的基本结构是这样的
var arrayOfArrays=[
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
],
结果1=[].concat.apply([],arrayOfArrays),
结果2=阵列远射线。减少(功能(acc、arr){
返回acc.concat(arr);
}, []);
document.getElementById('out').textContent=JSON.stringify(result1,null,2)+'\n'+JSON.stringify(result2,null,2)代码>
假设您的阵列法拉利
有一个基本结构,然后是这样的
var arrayOfArrays=[
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
],
结果1=[].concat.apply([],arrayOfArrays),
结果2=阵列远射线。减少(功能(acc、arr){
返回acc.concat(arr);
}, []);
document.getElementById('out').textContent=JSON.stringify(result1,null,2)+'\n'+JSON.stringify(result2,null,2)代码>
使用循环而不是应用
。如果不进一步了解阵列法拉利
就很难具体说明,另请参见将apply
与concat
一起使用是否会超出最大堆栈深度
,如果循环未崩溃,则很难执行该操作。也许您可以检查数据的大小,如果在某些限制下,请使用apply
,否则请使用循环。使用循环而不是apply
。如果不进一步了解阵列法拉利
就很难具体说明,另请参见将apply
与concat
一起使用是否会超出最大堆栈深度
,如果循环未崩溃,则很难执行该操作。也许您可以检查数据的大小,如果在某些限制下,请使用apply
,否则请使用循环。使用循环而不是apply
。如果不进一步了解阵列法拉利
就很难具体说明,另请参见将apply
与concat
一起使用是否会超出最大堆栈深度
,如果循环未崩溃,则很难执行该操作。也许您可以检查数据的大小,如果在某些限制下使用apply
,否则使用循环。在这种情况下,使用调用另一个函数的函数可能无法解决callstack限制问题。您认为这有什么问题?您试过了吗?使用调用另一个函数的函数恐怕无法解决这种情况下的调用堆栈限制问题。您认为这有什么问题?您试过了吗?使用调用另一个函数的函数恐怕无法解决这种情况下的调用堆栈限制问题。您认为这有什么问题?你试过了吗?
function test (msg,f) {
console.time(msg)
f()
console.timeEnd(msg)
}
function conc (a) {
return a.concat.apply([], a)
}
function push (a) {
var R = []
for(var i = 0; i < a.length; i++){
for(var j = 0; j < a[i].length; j++){
R .push (a[i][j])
}
}
return R
}
function conc2 (a) {
var R = []
for(var i = 0; i < a.length; i++)R.push.apply(R, a[i])
return R
}
L = []
for (var i = 0; i< 10000; i++) {
var S = []
for (var j = 0; j < 70; j++) S .push (Math.round (Math.random() * 500))
L.push(S)
}
//L = [[1,2], [3,4], [5,6], [7,8], [9,0]]
var A, B, C
test('concat', function (a,b,c) {
A = conc(L)
})
test('push', function (a,b,c) {
B = push(L)
})
test('concat2', function (a,b,c) {
C = conc2(L)
})
if (A.length < 200) console.log( JSON.stringify(A), JSON.stringify(B), JSON.stringify(C))
console.log( A.length, B.length, C.length)