Je suis un peu surpris que pour un problème aussi simple, il y ait autant de réponses difficiles à lire et que certaines, y compris celle choisie, ne fonctionnent pas.
Je souhaite généralement que la chaîne de résultats soit au maximum maxLen
caractères. J'utilise également cette même fonction pour raccourcir les slugs dans les URL.
str.lastIndexOf(searchValue[, fromIndex])
prend un second paramètre qui est l'index à partir duquel la recherche doit commencer à l'envers dans la chaîne de caractères, ce qui rend les choses efficaces et 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));
}
Il s'agit d'un exemple de sortie :
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"
Et pour la limace :
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"