【问题标题】:Javascript: uniform length of subarrays [duplicate]Javascript:子数组的统一长度[重复]
【发布时间】:2014-07-01 09:53:56
【问题描述】:

我正在尝试将数组拆分为块。块应该与函数指定的一样多。我已经拥有的是

groupBySize = function(array, groupSize){
    if(groupSize === 0){
        return;
    }
    var groups = [];
    var i,j,temparray;
    for (i=0,j=array.length; i<j; i+=groupSize) {
        temparray = array.slice(i,i+groupSize);
        groups.push(temparray);
    }
    return groups;
};
groupByNumberOfGroups = function(array, NumberOfGroups){
    var groupSize = Math.floor(array.length/NumberOfGroups);
    var groups = this.groupBySize(array, groupSize);
    // Let's make sure we get the right amount of groups
    while(groups.length > NumberOfGroups){
        console.log(groups.length + ">" + NumberOfGroups);
        var last = groups[(groups.length-1)];
        for(var j = 0; j< last.length; j++){
            var temp = j;
            while(groups[temp].length > groups[temp+1]){
                temp++;
            }
            groups[j].push(last[j]);
        }
        groups.pop();
    }
    return groups;
};

这成功地将数组拆分为正确数量的块。我希望它使每个块的长度尽可能统一,所以如果我将像 [1,2,3,4,5,6] 这样的数组拆分为 4 个块,我会得到 [[1,2 ],[3,4],[5],[6]]。 有什么建议吗?

另一个缺点示例:将 [1,2,3,4,5,6,7,8,9,10,11,12,13,14] 分成 8 个块,得到 [[1,2,3 ,4,5,6,7],[8],[9],[10],[11],[12],[13],[14]]

【问题讨论】:

  • 我不这么认为,这里已经使用了这个答案的想法,OP 询问如何获得适当大小的块

标签: javascript arrays distribution content-length


【解决方案1】:

简单的数学。如果您有 n 项目并希望将它们拆分为 k 块,则每个块都将具有 n / k 项目。但是如果n / k 不是整数呢?然后一些块将有n / k rounded down 项目,一些将有n / k rounded down + 1 项目。其中有多少人将拥有+ 1 项目? n % k.

function distribute(a, k) { 

    var count = Math.floor(a.length / k); 
    var remain = a.length % k; 
    var result = []; 
    var index = 0; 

    for (var i = 0; i < k; i++) { 

        var number = count + (i < remain ? 1 : 0); 
        result.push(a.slice(index, index + number));
        index += number; 
    } 

    return result; 
}

distribute([1, 2, 3, 4, 5, 6, 7], 2);

--> [[1, 2, 3, 4], [5, 6, 7]]

由 Nordfjord 编辑:更短,但分组的值与上述解决方案不同:

groupByNumberOfGroups = function(array, numberOfGroups){
    var groups = []
    for(var i = 0; i < numberOfGroups; ++i) groups.push([]);
    for(var i = 0; i < array.length; ++i) groups[i%numberOfGroups].push(array[i]);
    return groups;
}

【讨论】:

  • @Nordfjord:您好,感谢您的编辑,但我想您的代码应该得到它自己的答案,而不是注入我的代码。您的代码给出的结果与我的函数不同,所以请用您自己的代码创建您自己的答案,以便我们讨论,谢谢!
  • 直到 8 小时后我才有代表回答我的问题 :/ 不过将来会这样做,不过感谢您的回答,真的很有帮助。
【解决方案2】:

试试这个,

var groupByNumberOfGroups = function( array, NumberOfGroups ){
    var div = Math.floor( array.length / NumberOfGroups );
    var mod = array.length % NumberOfGroups;
    var result = [];

    var lowerBound=0, upperBound=0;
    for ( var k=0; k<NumberOfGroups; k++ ) {
        lowerBound = ( upperBound === 0 ) ? ( ( k < mod ) ? k * ( div + 1 ) : k * ( div ) ) : upperBound
        upperBound = ( k < mod ) ? ( lowerBound + div + 1 ) : ( lowerBound + div )
        result[ k ] = array.slice( lowerBound, upperBound );
    }
    return result;
};

groupByNumberOfGroups([1,2,3,4,5,6], 4); // [[1, 2], [3, 4], [5], [6]]
groupByNumberOfGroups([1,2,3,4,5,6,7,8,9,10,11,12,13,14], 8); // [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13], [14]] 

js 小提琴:link

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多