Me sorprende un poco que para un problema simple como este haya tantas respuestas que son difíciles de leer y algunas, incluida la elegida, no funcionan.
Por lo general, quiero que la cadena de resultado tenga como máximo maxLen
caracteres. También uso esta misma función para acortar las babosas en las URL.
str.lastIndexOf(searchValue[, fromIndex])
toma un segundo parámetro que es el índice en el que comenzar a buscar hacia atrás en la cadena, lo que hace que las cosas sean eficientes y simples.
// Shorten a string to less than maxLen characters without truncating words.
function shorten(str, maxLen, separator = ' ') {
if (str.length <= maxLen) return str;
return str.substr(0, str.lastIndexOf(separator, maxLen));
}
Esta es una salida de muestra:
for (var i = 0; i < 50; i += 3)
console.log(i, shorten("The quick brown fox jumps over the lazy dog", i));
0 ""
3 "The"
6 "The"
9 "The quick"
12 "The quick"
15 "The quick brown"
18 "The quick brown"
21 "The quick brown fox"
24 "The quick brown fox"
27 "The quick brown fox jumps"
30 "The quick brown fox jumps over"
33 "The quick brown fox jumps over"
36 "The quick brown fox jumps over the"
39 "The quick brown fox jumps over the lazy"
42 "The quick brown fox jumps over the lazy"
45 "The quick brown fox jumps over the lazy dog"
48 "The quick brown fox jumps over the lazy dog"
Y para la babosa:
for (var i = 0; i < 50; i += 10)
console.log(i, shorten("the-quick-brown-fox-jumps-over-the-lazy-dog", i, '-'));
0 ""
10 "the-quick"
20 "the-quick-brown-fox"
30 "the-quick-brown-fox-jumps-over"
40 "the-quick-brown-fox-jumps-over-the-lazy"
" too many spaces ".trim()