Есть массив из счисел в котором могут быть выколотые числа т.е. он не последовательный. var arr = [1,2,4,6,8,14,17,18,19]
Нужно написать функцию которая бы разбивала его на произвольное количество групп с приблизительно равным количеством элементов т.е. к примеру:
2: [1,2,4,6,8], [14,17,18,19]
3: [1,2,4], [6,8,14], [17,18,19]
4: [1,2], [4,6], [8,14], [17,18,19]
и все в этом стиле. Нужно разбитие именно примерное т.е. не страшно куда отойдет число которое не влезает.
Проблема в том, что никак не могу записать алгоритм который бы не терял последний элемент на нечетной длине массива.
function split(arr, numParts) {
const partSize = arr.length / numParts | 0;
return Array
.from({ length: numParts }, (n, i) => i * partSize)
.map((n, i, a) => arr.slice(n, a[i + 1]));
}
UPD. В комментариях было высказано мнение, что неплохо бы размерам кусков отличаться не более, чем на единицу, т.е., скидывать все "лишние" элементы в последний кусок не надо. Окей, раскидаем сколько можно по одному элементу в разные куски:
0xD34F, 4-4-5-5 и 5-5-4-4 же. Но вообще 4-4-4-6 и 5-5-5-3 ─ это ещё можно в +-1 записать (если размер чанка взять за 5 и 4 соответственно), но вот 2-2-2-2-2-2-6 за +-1 уже никак не выдать.