Как обрезать строку по количеству символов и до ближайшего пробела?

Есть такая функция:

const trimText = (text, length, end = '') => {
  return text.length <= length ?
    text :
    `${text.substr(0, length)}${end}`;
};

const text = 'Надо как то правильно обрезать от пробела'
const res = trimText(text, 15, end = '...')
console.log(res)

надо что бы было так: Надо как то правильно... а не Надо как то прав...


Ответы (2 шт):

Автор решения: OPTIMUS PRIME

.indexOf(искомая_подстрока, начальная_позиция) — найти первый пробел после указанного length и резать до него.

let text = 'Надо как то правильно обрезать от пробела';

console.log( trimText(text, 15, end='...') );

function trimText(text, length, end = '') {
  let index = text.indexOf(" ", length);
  if( index == -1 ) index = length;
  
  return text.slice(0, index) + end;
}

Если бы не он, можно было через .split(" ") начать добавлять элементы в финальную строку, while( result.length < length )

Или,

let text = 'Надо как то правильно обрезать от пробела';

console.log( trimText(text, 4, end='...') );
console.log( trimText(text, 5, end='...') );

function trimText(text, length, end = '') {
  let result = text.slice(0, length);
  let i = length;
  
  while( text[i] && text[i] != " " ) {
    result += text[ i++ ];
  }
  
  return result + end;
}

→ Ссылка
Автор решения: UModeL

Есть вариант с использованием регулярного выражения:

const trimText = (text, length, end = '') => {
  return text.replace(new RegExp(`(.{0,${length}}\\S*).*`,'i'), '$1') + end;
};

const text = 'Надо как-то правильно обрезать от пробела';
const res = trimText(text, 15, end = '...');
console.log(res);

→ Ссылка