Разбить строку на массив из 36 символов в каждой строке, не разбивая слова - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь разбить строку на массив из 36 символов в каждом индексе.Также слова не должны ломаться во время этого разделения.Я использую приведенный ниже код для разделения строки без разрывов слов, но это проверяет следующий пробел после 36 достигнут.Мое требование: если первый индекс достигает 36 символов, то он должен проверить предыдущий пробел в этой строке и переместить это слово в следующий индекс в массиве.

Например, если у меня есть строка «Это новый контент для разработки». Его следует разбить на две строки как

[0] - это новый контент для

[1] -developing

В настоящее время приведенный ниже код разбивает это на одну строку, например

[0] - это новый контент для разработки

         var count; var len=36; 
         var curr = len; var prev = 0;          
         while (data[curr]) { 
                   if (data[curr++] == ' ') { 
                        splitArr.push(data.substring(prev,curr)); 
                         prev = curr; 
                          curr += len; 
                        } 
                      } 

        splitArr.push(data.substr(prev)); 

Что я могу использовать вместо data [curr ++] в условии if, чтобы получить пробел до 36 символов?

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Простейший способ использования границ слов

(?:^|\b)[\w .]{1,36}(?:\b|$)

let str = `This is a demonstration of how your code might work with a longer text string`

let op = str.match(/(?:^|\b)[\w .]{1,36}(?:\b|$)/gi)

console.log(op)

Regex demo

0 голосов
/ 06 февраля 2019

Лично я разбивал бы строку на слова и добавлял их в пакеты, пока мы не передадим максимальный размер (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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...