2011-10-14 52 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:由于您的第一个组总是有一个元素,所以您可能需要稍微调整一下这个特殊情况的代码。

相关问题