【问题标题】:Aggregating JavaScript array into several arrays with different element lengths?将 JavaScript 数组聚合成几个元素长度不同的数组?
【发布时间】:2011-12-07 19:06:28
【问题描述】:

我有一个包含 101 个值的数组(代表 0-100 岁的人)。

什么是一次构建这些聚合数组的最好的快速和简单的方法:

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”)命名这些聚合数组?如果其他程序员遇到这些定义,直观吗?

【问题讨论】:

  • 您不需要使用对象进行输出:javascript 数组是稀疏的:stackoverflow.com/questions/1510778/… 因此输出可以是只有四个元素(1、5、10、20)的数组。最后没有任何区别。当然,间隔会更直观。
  • @xanatos:但我确实使用数组作为实际输出? i1 应该有 101 个元素; i5、20元素等等。更具体地说,我对在一个循环中执行此操作而不是单独执行此操作感兴趣。 (其中 n 是间隔选项的数量。)
  • 它仍然会很快!不要预先优化。更快地做到这一点的唯一方法是对输入数组进行排序并以 5、10 和 20 的步幅对其进行遍历。否则,您将始终具有 O(n * m) 复杂度(n = input.length,m = number间隔)
  • 您的产品范围是否有意设置不同的尺寸?第一组总是比其他组多一个元素(例如,0-5 有六个可能的值,而 6-10、11-5、... 只有五个)。

标签: javascript arrays nomenclature


【解决方案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:不确定您是要输出一个对象(如本代码所示)还是二维数组。

PS2:由于您的第一组总是多出 1 个元素,因此您可能需要针对这种特殊情况稍微调整代码。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2013-07-17
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2011-01-02
    • 2017-08-04
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多