Imaginez une fonction de mise à zéro des nombres n => n.padStart(8, "0")
qui prend n'importe quel nombre et le remplit, c'est-à-dire
- "19" -> "00000019"
- "123" -> "00000123"
Cette fonction peut être utilisée pour aider à trier les "19"
de manière à ce qu'elle apparaisse avant la chaîne de caractères "123"
chaîne de caractères.
Ajoutons une expression rationnelle /\d+/g
la création de la fonction d'expansion naturelle str => str.replace(/\d+/g, n => n.padStart(8, "0"))
qui ne trouve que les sections numériques d'une chaîne et les remplit, c'est-à-dire
- "19asd" -> "00000019asd"
- "123asd" -> "00000123asd"
Nous pouvons maintenant utiliser cette fonction d'expansion naturelle pour mettre en œuvre le tri par ordre naturel :
const list = [
"123asd",
"19asd",
"12345asd",
"asd123",
"asd12"
];
const ne = str => str.replace(/\d+/g, n => n.padStart(8, "0"));
const nc = (a,b) => ne(a).localeCompare(ne(b));
console.log(list.map(ne).sort()); // intermediate values
console.log(list.sort(nc)); // result
Les résultats intermédiaires démontrés par list.map(ne).sort()
montrent ce que le ne
La fonction d'expansion naturelle le fait. Elle met en œuvre la mise à zéro des nombres uniquement sur les parties numériques de la chaîne et laisse les composants alphabétiques inchangés.
[
"00000019asd",
"00000123asd",
"00012345asd",
"asd00000012",
"asd00000123"
]
La version finale de la solution met en œuvre un comparateur d'ordre naturel nc
mis en œuvre en tant que (a,b) => ne(a).localeCompare(ne(b))
et l'utilise dans list.sort(nc)
afin que les choses soient ordonnées correctement :
[
"19asd",
"123asd",
"12345asd",
"asd12",
"asd123"
]