Jestem trochę zdziwiony, że na taki prosty problem jest tak wiele odpowiedzi, które są trudne do odczytania, a niektóre, w tym ta wybrana, nie działają.
Zwykle chcę, aby wynikowy ciąg składał się z maksymalnie maxLen
znaków. Używam również tej samej funkcji, aby skrócić informacje o błędach w adresach URL.
str.lastIndexOf(searchValue[, fromIndex])
przyjmuje drugi parametr, który jest indeksem, od którego należy rozpocząć wyszukiwanie wstecz w ciągu, dzięki czemu wszystko jest wydajne i proste.
// 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));
}
Oto przykładowe dane wyjściowe:
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"
A dla ślimaka:
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()