Comment trier un tableau associatif ?
sortByPseudo : foncteur de tri de chaînes de caractères "pseudo"
sortById : foncteur de tri d'entier "id"
sortByNbMsg : foncteur de tri d'entier "nbmsg"
utilisateurs : un tableau associatif classique
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| <html><head><title>Test</title>
</head><body>
<script type="text/javascript">
<!--
function sortByPseudo(a,b){
return sortStringNoCase(a,b,"pseudo");
}
function sortByNbMsg(a,b){
return sortInt(a,b,"nbmsg");
}
function sortById(a,b){
return sortInt(a,b,"id");
}
function sortStringNoCase(a,b,field){
var v1 = a[field].toLowerCase();
var v2 = b[field].toLowerCase();
if (v1<v2) return -1;
if (v1>v2) return 1;
return 0;
}
function sortInt(a,b,field){
var v1 = parseInt(a[field]);
var v2 = parseInt(b[field]);
if (v1<v2) return -1;
if (v1>v2) return 1;
return 0;
}
var utilisateurs = new Array();
utilisateurs[0] = new Array();
utilisateurs[0]["pseudo"] = "SpaceFrog";
utilisateurs[0]["nbmsg"] = "17052";
utilisateurs[0]["id"]= "547";
utilisateurs[1] = new Array();
utilisateurs[1]["pseudo"] = "Auteur";
utilisateurs[1]["nbmsg"] = "3458";
utilisateurs[1]["id"]= "36505";
utilisateurs[2] = new Array();
utilisateurs[2]["pseudo"] = "Le_Chomeur";
utilisateurs[2]["nbmsg"] = "88046";
utilisateurs[2]["id"]= "547";
utilisateurs[3] = new Array();
utilisateurs[3]["pseudo"] = "Bovino";
utilisateurs[3]["nbmsg"] = "1510";
utilisateurs[3]["id"]= "243304";
utilisateurs[4] = new Array();
utilisateurs[4]["pseudo"] = "Bisûnûrs";
utilisateurs[4]["nbmsg"] = "6315";
utilisateurs[4]["id"]= "29957";
document.write("<h1>Tri par pseudo<\/h1><p>");
var res = utilisateurs.sort(sortByPseudo);
for (var i=0;i<res.length;i++)
{
document.write("<dl><dt>Individu "+(i+1)+"<\/dt>");
for (var propriete in res[i])
document.write("<dd>"+ propriete + ": "+res[i][propriete]+"<\/dd>");
document.write("<\/dl>");
}
document.write("<\/p><h1>Tri par nombre de messages<\/h1><p>");
res = utilisateurs.sort(sortByNbMsg);
for (var i=0;i<res.length;i++)
{
document.write("<dl><dt>Individu "+(i+1)+"<\/dt>");
for (var propriete in res[i])
document.write("<dd>"+ propriete + ": "+res[i][propriete]+"<\/dd>");
document.write("<\/dl>");
}
document.write("<\/p><h1>Tri par id<\/h1><p>");
res = utilisateurs.sort(sortById);
for (var i=0;i<res.length;i++)
{
document.write("<dl><dt>Individu "+(i+1)+"<\/dt>");
for (var propriete in res[i])
document.write("<dd>"+ propriete + ": "+res[i][propriete]+"<\/dd>");
document.write("<\/dl>");
}
document.write("<\/p>");
//-->
</script>
</body></html> |
si on ne veut pas utiliser un tableau associatif "classique" (pour x raisons) on peut également trier un tableau d'objets et utiliser quand même la méthode sort() des Array. le code est strictement le même puisqu'un Array est un objet et que pour accéder à une propriété d'un objet on peut utiliser la syntaxe monObjet["maPropriété"]
testez le code précédent avec ce nouveau tableau :
1 2 3 4 5 6 7
| var utilisateurs = new Array(
{pseudo:"SpaceFrog ", nbmsg:"17052", id:"547"},
{pseudo:"Auteur ", nbmsg:"3458", id:"36505"},
{pseudo:"Le_Chomeur", nbmsg:"1663", id:"88046"},
{pseudo:"Bovino ", nbmsg:"1510", id:"243304"},
{pseudo:"Bisûnûrs ", nbmsg:"6315", id:"29957"}
); |
dans les exemples précédents il faut bien voir que chaînes et entiers ne s'ordonnent pas de la même façon.
en chaîne : "1111" < "9"
en entier : 1111 > 9
d'où la conversion des représentations d'entiers sous forme de chaînes de caractères en "vrais" entiers (si l'on puit dire en JavaScript) avec la fonction sortInt.
ce n'est pas conseillé par soucis de cohérence, mais les id et nbmsg des exemples précédents peuvent mixer les notations chaîne et entière. Le parseInt
lisse tout pendant le traitement
2ème chose : La comparaison de chaînes est sensible à la casse. donc si vous voulez trier des chaines sans vous soucier de la casse faites comme dans sortStringNoCase() et appliquer un toLowerCase() ou toUpperCase() sur vos chaînes
Et pour ceux qui veulent étendre les fonctionnalités des Array JavaScript, vous pouvez ajouter ces fonctions de tris (et d'autres de votre crues) à la classe Array :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| Array.prototype.sortInt = function(){
var direction = 1;
switch(arguments.length)
{
case 0 : return this;
case 1 : break;
default :
switch (arguments[1].toLowerCase())
{
case "asc" : break;
case "desc" : direction = -1; break;
default : return this;
}
}
var field = arguments[0];
if (this[field]===undefined)
return this;
return this.sort(function(a,b){
var v1 = parseInt(a[field]);
var v2 = parseInt(b[field]);
if (v1<v2) return -direction;
if (v1>v2) return direction;
return 0;
});
}
Array.prototype.sortString = function(){
var direction = 1;
switch(arguments.length)
{
case 0 : return this;
case 1 : break;
default :
switch (arguments[1].toLowerCase())
{
case "asc" : break;
case "desc" : direction = -1; break;
default : return this;
}
}
var field = arguments[0];
if (this[field]===undefined)
return this;
return this.sort(function(a,b){
var fact = asc ? 1 : -1;
var v1 = a[field].toLowerCase();
var v2 = b[field].toLowerCase();
if (v1<v2) return -direction;
if (v1>v2) return direction;
return 0;
});
}
utilisateurs.sortInt("id","asc");
var msg = "";
for (var i=0; i<utilisateurs.length; i++){
msg += utilisateurs[i].id + "\n";
}
alert(msg);
utilisateurs.sortInt("id","desc");
var msg = "";
for (var i=0; i<utilisateurs.length; i++){
msg += utilisateurs[i].id + "\n";
}
alert(msg); |
Vous avez alors accès directement à partir de n'importe Array JavaScript aux fonctions de tri ascendant et descendant pour les chaînes de caractères et les entiers (c'est pas beautiful ça ?)
Partager