为了账号安全,请及时绑定邮箱和手机立即绑定

将JS数组拆分为N个数组

将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/你会怎么做?谢谢!
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

您可以将切片设为“平衡”(子数组的长度差异尽可能小)或“偶数”(除了最后一个的所有子数组都具有相同的长度):


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>


查看完整回答
反对 回复 2019-10-08
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我认为使用拼接的这种方式最干净:


splitToChunks(array, parts) {

    let result = [];

    for (let i = parts; i > 0; i--) {

        result.push(array.splice(0, Math.ceil(array.length / i)));

    }

    return result;

}

例如,对于parts = 3,您将占剩余部分的1/3,然后是1/2,然后是数组的其余部分。Math.ceil确保在元素数量不均匀的情况下,它们将排到最早的块。


(注意:这会破坏初始数组。)


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 1850 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信