小编典典

将JS数组拆分为N个数组

javascript

想象一下,我有一个这样的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));
}

你会怎么做?谢谢!


阅读 314

收藏
2020-05-01

共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();

}


<p>slice <input type="number" value="20" id="s"> items into

<input type="number" value="6" id="n"> chunks:</p>

<pre id="b"></pre>

<pre id="e"></pre>
2020-05-01