开发者社区 问答 正文

将JS数组拆分为N个数组

想象一下,我有一个这样的JS数组:

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; 我想要的是将该数组拆分为N个较小的数组。例如:

split_list_in_n(a, 2) [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11]]

For N = 3: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11]]

For N = 4: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]

For N = 5: [[1, 2, 3], [4, 5], [6, 7], [8, 9], [10, 11]] 对于Python,我有这个:

def split_list_in_n(l, cols): """ Split up a list in n lists evenly size chuncks """ start = 0 for i in xrange(cols): stop = start + len(l[i::cols]) yield l[start:stop] start = stop 对于JS,我可以提出的最佳解决方案是递归函数,但我不喜欢它,因为它既复杂又丑陋。这个内部函数返回一个像这样的数组[1,2,3,null,4,5,6,null,7,8],然后我必须再次循环并手动拆分它。(我的第一次尝试是返回此:[1、2、3,[4、5、6,[7、8、9]]],然后我决定使用null分隔符进行操作。)

function split(array, cols) { if (cols==1) return array; var size = Math.ceil(array.length / cols); return array.slice(0, size).concat([null]).concat(split(array.slice(size), cols-1)); } 这是一个jsfiddle:http : //jsfiddle.net/uduhH/

你会怎么做?谢谢! 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 20:39:02 536 分享 版权
1 条回答
写回答
取消 提交回答
  • 您可以使条带“平衡”(子阵列的长度差异尽可能小)或“偶数”(除最后一个以外的所有子阵列具有相同的长度):

    function chunkify(a, n, balanced) {

    if (n < 2)
        return [a];
    
    var len = a.length,
            out = [],
            i = 0,
            size;
    
    if (len % n === 0) {
        size = Math.floor(len / n);
        while (i < len) {
            out.push(a.slice(i, i += size));
        }
    }
    
    else if (balanced) {
        while (i < len) {
            size = Math.ceil((len - i) / n--);
            out.push(a.slice(i, i += size));
        }
    }
    
    else {
    
        n--;
        size = Math.floor(len / n);
        if (len % size === 0)
            size--;
        while (i < size * n) {
            out.push(a.slice(i, i += size));
        }
        out.push(a.slice(size * n));
    
    }
    
    return out;
    

    }

    ///////////////////////

    onload = function () { function $(x) { return document.getElementById(x); }

    function calc() {
        var s = +$('s').value, a = [];
        while (s--)
            a.unshift(s);
        var n = +$('n').value;
        $('b').textContent = JSON.stringify(chunkify(a, n, true))
        $('e').textContent = JSON.stringify(chunkify(a, n, false))
    }
    
    $('s').addEventListener('input', calc);
    $('n').addEventListener('input', calc);
    calc();
    

    }

    slice items into chunks:

     
    
    2020-02-08 20:39:21
    赞同 展开评论
问答分类:
问答标签:
问答地址: