Concat比堆栈更多的数组允许

时间:2015-06-04 09:35:24

标签: javascript arrays

[].concat.apply([], arrayOfArrays)

这就是我将多个数组连接成一个数组(它们只是持有数字)。

不幸的是,当数组的数量太大时,我得到超出最大堆栈深度。如何连接多个数组而不是VM可以推送堆栈?

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) 

结果是concat.apply:20ms,push:80ms,concat loop:60 ms

apply快得多!但它仅限于堆栈大小。如何克服堆栈限制保持性能?

1 个答案:

答案 0 :(得分:0)

假设你arrayOfArrays的基本结构,那就是这样的。

&#13;
&#13;
var arrayOfArrays = [
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]
    ],
    result1 = [].concat.apply([], arrayOfArrays),
    result2 = arrayOfArrays.reduce(function (acc, arr) {
        return acc.concat(arr);
    }, []);

document.getElementById('out').textContent = JSON.stringify(result1, null, 2) + '\n' +JSON.stringify(result2, null, 2);
&#13;
<pre id="out"></pre>
&#13;
&#13;
&#13;