Разбиение массива на равные части - PullRequest
1 голос
/ 21 марта 2019

Я ищу алгоритм Javascript для разбиения массива на куски, но избегаю небольших остатков.Например:

_.chunk([1, 2, 3, 4, 5, 6, 7], 3) // [[1, 2, 3], [4, 5, 6], [7]]

Но я хочу это:

_.chunk([1, 2, 3, 4, 5, 6, 7], 3) // [[1, 2, 3], [4, 5], [6, 7]]

_.chunk([1, 2, 3, 4, 5, 6, 7], 4) // [[1, 2, 3, 4], [5, 6, 7]]

_.chunk([1, 2, 3, 4, 5, 6, 7], 5) // [[1, 2, 3, 4], [5, 6, 7]]

_.chunk([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3) // [[1, 2, 3], [4, 5, 6], [7, 8], [9, 10]]

Таким образом, в основном выходные данные распределены по нескольким массивам с максимальным количеством элементов, переданных в качестве второго аргумента.

1 Ответ

4 голосов
/ 21 марта 2019

Вы должны пересчитать размер, который, возможно, должен быть меньше указанного. Затем вычислите, где размер должен быть на единицу меньше для оставшихся кусков.

Таким образом, у вас будет потенциально два разных размера чанка (которые отличаются на 1). Для обоих вы можете назвать оригинал _.chunk:

function chunk(arr, size) {
    const count = Math.ceil(arr.length / size);
    size = Math.ceil(arr.length / count);
    const i = arr.length-(size-1)*(arr.length%size && size-(arr.length%size));
    return _.chunk(arr.slice(0, i), size).concat(
           _.chunk(arr.slice(i), size-1));
}

for (let i = 1; i < 9; i++) {
    console.log(i, JSON.stringify(chunk([1, 2, 3, 4, 5, 6, 7], i)));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
...