Лично я разбивал бы строку на слова и добавлял их в пакеты, пока мы не передадим максимальный размер (36
), после чего мы начнем новый пакет.
Мы разбиваем строкув слова с .split()
.Я использую регулярное выражение вместо обычного .split(" ")
, потому что я хочу включать пробелы , когда я разбиваю строку.
Когда мы перебираем элементы, мы смотрим на последний элемент.Будет ли добавление этой строки в этот последний элемент более 36 символов?Если это так, он запускает новый элемент.Если нет, он добавляет его к предыдущему.
Для итерации и объединения элементов я решил использовать Array.reduce()
.
const str = "This is a demonstration of how your code might work with a longer text string. ";
const charLimit = 36;
let result = str
.split(/(\s+)/)
.reduce((output, item) => {
let last = output.pop() || ""; //get the last item
return last.length + item.length > charLimit //would adding the current item to it exceed 36 chars?
? [...output, last, item] //Yes: start a new item
: [...output, last + item] //No: add to previous item
}, []);
console.log("Result:");
console.log(result);
console.log("With lengths:");
console.log(result.map(i => ({string: i, length: i.length})));
console.log("Trimmed:");
console.log(result.map(i => i.trim()));