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. В комментариях было высказано мнение, что неплохо бы размерам кусков отличаться не более, чем на единицу, т.е., скидывать все "лишние" элементы в последний кусок не надо. Окей, раскидаем сколько можно по одному элементу в разные куски:
function split(arr, numParts) {
const partSize = arr.length / numParts | 0;
const numLooseItems = arr.length % numParts;
return Array.from(
{ length: numParts },
function(_, i) {
return arr.slice(this(i), this(i + 1));
},
i => i * partSize + Math.min(i, numLooseItems)
);
}