異なるサイズのチャンク(4、3、3、3、4、3、3、3、など)に分割アレイ

FooBarの:

私はそうのような配列を持っています:[1, 2, 3, 4, 5, 6, 7, 9, 10]4、3、3、3、4、3、3、3のようなので、私はまだの単純なパターンで、異なるサイズのチャンクにチャンクにそれを必要とします:

[
    [ // four
        1,
        2,
        3,
        4
    ],
    [ // three (1/3)
        5,
        6,
        7
    ],
    [ // three (2/3)
        8,
        9,
        10
    ],
    [ // three (3/3)
        11,
        12,
        13
    ],
    [ // four
        14,
        15,
        16,
        17
    ],
    [ // three (1/3)
        18,
        19,
        20
    ], // and so on..
]

私は、私がカスタマイズされているこのコードを試してみました:

const arr; // my array of values
const chuncked = arr.reduce((acc, product, i) => {
    if (i % 3) {
        return acc;
    } else if (!didFourWayReduce) {
        didFourWayReduce = true;
        fourWayReduces++;

        if ((fourWayReduces - 1) % 2) { // only make every second a "4 row"
            return [...acc, arr.slice(i, i + 3)];
        } else {
            return [...acc, arr.slice(i, i + 4)];
        }
    } else {
        didFourWayReduce = false;
        return [...acc, arr.slice(i, i + 3)];
    }
}, []);

そして、それは動作しますが、ほとんど、1つのキーが3のすべての最初のチャンクを繰り返しているのでスリーの最初のチャンク(1/3)4とチャンクの最後の要素を持っていることを期待しています。そのようです:

[
    [
        1,
        2,
        3,
        4
    ],
    [
        4, // this one is repeated, and it shouldn't be
        5,
        6
    ]
]
ニーナショルツ:

あなたは、2つのインデックス、データ配列用とサイズのための1つを取ることができます。その後、所定の長さの配列をスライスし、チャンク列にチャンクを押します。

データの最後まで進みます。

var data = Array.from({ length: 26 }, (_, i) => i + 1),
    sizes = [4, 3, 3, 3],
    i = 0,
    j = 0,
    chunks = [];

while (i < data.length) chunks.push(data.slice(i, i += sizes[j++ % sizes.length]));

console.log(chunks);
.as-console-wrapper { max-height: 100% !important; top: 0; }

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=7744&siteId=1