Как обрезать строку до определенной длины и добавить многоточие?
Если нужно просто обрезать строку по количеству символов, то этого можно добиться, например одной из этих функций:

const truncateString = (s, w) => s.length > w ? s.slice(0, w) + "..." : s;

const truncateString = (s, w) => s.length > w ? s.substring(0, w) + "..." : s;

Пример использования:

console.log(truncateString("123456789", 5));

Но в этих двух вариантах есть по крайней мере, один заметный минус. Если после обрезки строки, в конце будет пробел: "123456   789", то выглядеть результат будет так: "123456  ..."

Это решается достаточно легко. Воспользуемся функцией .trim() и в итоге, выше описанные функции, будут выглядеть так:

const truncateString = (s, w) => s.length > w ? s.slice(0, w).trim() + "..." : s;

const truncateString = (s, w) => s.length > w ? s.substring(0, w).trim() + "..." : s;

Дополнительные решения
Если нужно обрезать строку, а также удалить и определенные символы с конца строки(лишние точки, запятые, пробелы и прочее), перед добавлением троеточия, тогда можно сделать вот так:

const truncateStringByLimitChars = ({ target, limit, pattern, useREGEx = true }) => {
  const ignoredChars = new RegExp(`[${pattern}]+$`, "g");

  const truncateString = () => {
    return useREGEx === false
      ? target.substring(0, limit).trim() + "..."
      : target.substring(0, limit).replace(ignoredChars, "").trim() + "...";
  };

  return target.length >= limit ? truncateString() : target;
};

Пример использования:

console.log(
  truncateStringByLimitChars({
    target: "1234_______",
    limit: 8,
    pattern: [",", ".", "_"]
  })
);

Однако в таком случае - финальный размер строки, может быть намного меньше указанного в лимите, потому что функция удалит с конца строки все "лишние" символы. Хотя в некоторых случаях это может быть полезно. 

К примеру имеется строка:  Hello__World. Обрезаем без удаления "лишних" символов до 7 символов:

let string = "Hello__World",

console.log(string.length > 7 ? string.slice(0, 7).trim() + "..." : string)

Результат: Hello__...

Наверное, ожидалось что в конце перед точками, не будет подчеркивания, однако оно есть и портит своим присутствием полученный результат. Тоже самое будет если вместо подчеркивания будет запятая, вопросительный знак, восклицательный знак и прочее. 

Возможно такой результат не совсем так плох, но всё же, порой это выглядит не слишком, как-бы, красиво и/или удобно. А вот если удалить лишние символы, после обрезки по лимиту символов, то конечно финальный результат будет выглядеть лучше. 

Однако это ещё не всё и при желании, можно дополнительно улучшить функцию - truncateStringByLimitChars, чтобы она корректно работала с такими строками:

Hello-World.loooooooong.image.name.sss.123456789.jpg
BackgroundImage_for__container.with.blog-news.cards.jpg

Допустим имеется такая строка: "BackgroundImageForContainerWithBlogNewsCards.jpg"  - это название изображения, которое выводится в определенном блоке. 

Пример:

<div>Файл "BackgroundImageForContainerWithBlogNewsCards.jpg" успешно загружен</div>

Задача: Обрезать эту длинную строку до 15 символов + сохранить расширение файла. 

Можно конечно и не модифицировать функцию, чтобы получить желаемый результат, например склеивая обрезанную строку с полученным расширением файла вне функции truncateStringByLimitChars, но это уже другая история и поэтому всё же модифицируем функцию.

Модифицированная версия будет выглядеть так:

const truncateString = configuration => {
     const {
        targetString: target,
        limitWords: limit,
        pattern = [",", ".", "_"],
        useREGEx = true,
        suffix = "...",
        addFileExtension = false
    } = configuration;

     const ignoredChars = new RegExp(`[${pattern}]+$`, "g");

     const reduceContentByLimitCharset = () => {
          return useREGEx === false ?
             target.substring(0, limit).trim() :
             target.substring(0, limit).replace(ignoredChars, "").trim();
     };

     const updatedContent = () => {
          const croppedString = reduceContentByLimitCharset();
          const fileExtension = target.slice(target.lastIndexOf(".") + 1);

          return addFileExtension === false ?
             `${croppedString}${suffix}` :
             `${croppedString}${suffix} .${fileExtension}`;
     };

     return target.length >= limit ? updatedContent() : target;
};

Использование:

console.log(
     truncateString({
          targetString: "BackgroundImageForContainerWithBlogNewsCards.jpg",
          limitWords: 15,
          addFileExtension: true
     })
);

Результат: BackgroundImage... .jpg

Есть конечно и другие варианты решения всех этих задач по обрезке строк, но, возможно вышеописанных методов будет достаточно.
В итоге воспользовался вот этой конструкцией:
const cut = title => {
        return title.length > 83 ? `${title.slice(0, 83)}…` : title
      }