function chunked(str, numChunks) {
const chunkSize = Math.ceil(str.length / numChunks);
return Array.from(
{ length: numChunks },
(_, i) => str.slice(i * chunkSize, (i + 1) * chunkSize)
);
}
UPD. В комментариях докладывают:
неаккуратненько как-то:
chunked('test', 3) // [ "te", "st", "" ]
Это поправимо. Наверное. Размер куска округляем вниз. Есть два варианта:
Первый - закидываем остаток в последний кусок:
const chunked = (str, numChunks) =>
Array.from(
{ length: numChunks },
function(_, i) {
return str.slice(this(i), i < ~-numChunks ? this(-~i) : str.length);
},
i => i * (Math.max(1, str.length / numChunks | 0))
);
Второй - раскидываем по одному дополнительному элементу в те куски, что идут первыми:
function chunked(str, numChunks) {
const chunkSize = str.length / numChunks | 0;
const numLooseItems = str.length % numChunks;
const chunkIndex = i => i * chunkSize + Math.min(i, numLooseItems);
return Array.from(
{ length: numChunks },
(_, i) => str.slice(chunkIndex(i), chunkIndex(-~i))
);
}