J'ai joué en essayant d'obtenir une fonction qui va trier une sélection de balises li par leur contenu, mais actuellement en vain (au moins pas de vitesse/précision); Il est à la fois lent et pas génial au moment du tri. Idéallement, il trierait en fonction du contenu d'une balise forte qui réside dans le li.Trier un ensemble de balises li alphanumériques
est ici la fonction alphaNumSort si vous êtes intéressé (cela fonctionne un régal est juste le html merdique et des déchets de clonage qui est pas vraiment travailler)
function alphaNumSort(m,n){
try{
var cnt= 0,tem;
var a= m.toLowerCase();
var b= n.toLowerCase();
if(a== b) return 0;
var x=/^(\.)?\d/;
var L= Math.min(a.length,b.length)+ 1;
while(cnt< L && a.charAt(cnt)=== b.charAt(cnt) &&
x.test(b.substring(cnt))== false && x.test(a.substring(cnt))== false) cnt++;
a= a.substring(cnt);
b= b.substring(cnt);
if(x.test(a) || x.test(b)){
if(x.test(a)== false)return (a)? 1: -1;
else if(x.test(b)== false)return (b)? -1: 1;
else{
var tem= parseFloat(a)-parseFloat(b);
if(tem!= 0) return tem;
else tem= a.search(/[^\.\d]/);
if(tem== -1) tem= b.search(/[^\.\d]/);
a= a.substring(tem);
b= b.substring(tem);
}
}
if(a== b) return 0;
else return (a >b)? 1: -1;
}
catch(er){
return 0;
}
}
Vive
+1 innerText est sans aucun doute une meilleure approche que innerHTML. Les chaînes peuvent encore avoir besoin d'un traitement, que diriez-vous de couper les espaces dans le cas où le balisage d'imbrication est incohérent? Aussi 'Array.sort' est non-standard, il devrait être' Array.prototype.sort.call'. – bobince
Merci pour les commentaires et le +1. 'Array.sort' est très certainement standard, mais il est certainement moins compatible qu'avec' Array.prototype'. Je mettrai à jour ma réponse pour refléter votre commentaire, ajoutant le post-traitement de texte comme exercice pour le lecteur :) –
+1 IMHO 'li.get(). Sort' est plus intuitif pour des lecteurs du code. –