2011-10-14 65 views
0

我有101個值的數組(代表0-100歲的人)。將JavaScript數組聚合成具有不同元素長度的幾個數組?

什麼是一氣呵成建設這些聚集陣列的最好快速簡單的方式:

var input = [55,33,12 .. 98 more] 

var output = { 

    //same as input 
    i1 = [], 

    //0-5, 6-10, 11-15 ... 96-100 
    i5 = [], 

    //0-10, 11-20, 21-30 ... 91-100 
    i10 = [], 

    //0-20, 21-40, 41-60 ... 81-100 
    i20 = [], 
} 

在一個側面說明:您會被間隔(「I1」命名這些骨料陣列「 i5「)還是按組/元素的數量(」g100「,」g20「) - 如果其他程序員遇到這些定義,那麼更直觀些什麼?

+0

你不需要使用一個對象輸出:javascript數組是稀疏的:http://stackoverflow.com/questions/1510778/are-javascript-array-sparse因此輸出可以是一個只有四個元素的數組( 1,5,10,20)。最終沒有任何區別。當然,間隔時間會更直觀。 – xanatos

+0

@xanatos:但我確實使用數組作爲實際輸出? i1應該有101個元素; i5,20元素等。更具體地說,我對在一個循環中執行此操作的性能感興趣,而不是單獨進行。 (其中n是區間選擇的數量。) – dani

+0

它仍然很快!不要預先優化。更快地做到這一點的唯一方法是對輸入數組進行排序,並以5,10和20的步長對其進行排序。其他方面,您將始終具有O(n * m)的複雜性(n = input.length,m = number間隔) – xanatos

回答

1

您可以重新使用聚合結果來計算下一個數組。

// sums up each n numbers from the input array 
// 
function groupSum(inarray, n) { 
    var outarray = []; 
    var sum = 0; 
    for (var i = 0; i < inarray.length; i++) { 
     sum += inarray[i]; 
     if (i % n == n - 1) {outarray.push(sum); sum = 0;} 
    } 
    // add the last element 
    if (i % n != 0) { outarray.push(sum); } 

    return outarray; 
} 

var input = [55, 33, 12, 98, /* more numbers here */ 3, 4, 1, 2, 0, 7]; 

var output = {}; 
output.i1 = input; 
output.i5 = groupSum(output.i1, 5); 
output.i10 = groupSum(output.i5, 2); 
output.i20 = groupSum(output.i10, 2); 

請注意,正如xanatos所說,性能在這裏並不是真正的大問題。

PS1:不確定您是否試圖使輸出成爲對象(如在此代碼中)或2D數組。

PS2:由於您的第一個組總是有一個元素,所以您可能需要稍微調整一下這個特殊情況的代碼。

相關問題