| développez.com |
L'ouèbe d'Iza |
L'objet Array et les variables de tableauxCette page a été testé avec Internet
Explorer 5.5 ( bons résultats ) et avec Netscape Communicator
4.7 ( pourri ! ) sous Windows 95 ( je sais, c'est vieux comme OS ).
|
Croyez-le ou non, ce document se voulait au départ le résumé de 5 pages d'un manuel JavaScript format de poche !
Au tout début, je voulais juste faire en exercices les exemples du manuel que j'étais en train de lire. À savoir JavaScript 1.5 ( éditions CampusPress, voir la bibliographie à la fin de ce document ). Mais, dans un navigateur, le résultat d'un script ne donnant pas beaucoup d'indications sur le script lui-même, j'ai cru bon d'y ajouter quelques bref commentaires. Ceux-ci ne suffisant pas toujours, j'ai ajouté aussi la transcription HTML du script lui-même. Ces transcriptions nécessitant à leur tour quelques explications... et la roue tourne !
Tant et si bien que maintenant, ce document débute avec une table des matières. Si vous l'imprimez, vous obtiendrez pas loin d'une dizaine de pages en format Lettre ( l'équivalent américain du A4 ). Nous somme loin du cinq pages en format de poche...
| Tables des matières | Rubrique suivante |
Lorsqu'on déclare une variable ( implicitement ou explicitement ) et qu'on l'utilise comme tableau de valeurs, on crée en fait un objet Array qui possède des propriétés et des méthodes comme n'importe quel autre objet.
On déclare d'abord la variable en tant que nouveau tableau ( new Array( ) ) puis on remplis le tableau indice par indice.
semaine = new Array(7) semaine[0] = "dimanche" semaine[1] = "lundi" semaine[2] = "mardi" semaine[3] = "mercredi" semaine[4] = "jeudi" semaine[5] = "vendredi" semaine[6] = "samedi"
Le mot clé new est un opérateur qui sert exclusivement à créer une instance d'objet. Ici nous avons créé un objet de la classe Array nommé semaine.
Notez que la taille du tableau est explicitement indiquée
en paramètre et que chaque indice est placé entre
crochets ( [ et ] ). Le plus grand indice correspond à
la taille du tableau -1 (le premier indice étant toujours 0).
Notez aussi qu'il n'est pas nécessaire d'indiquer
la taille lors de la déclaration du tableau.
Vous pourrez trouver plus d'explications dans un manuel comme JavaScript et VBScript, manuel pratique aux éditions ENI ( page 132 : Voir la bibliographie au bas de cette page ) ou encore sur le site devedge.netscape.com dans la partie Array de la référence JavaScript 1.5 ( voir la Webbographie au bas de cette page ).
Exemple 1 :
Le script suivant affiche la
valeur de semaine à l'indice 4 :
<html><head> <title>Les tableaux</title> </head><body> <script language="javascript" type="text/javascript"> <!-- semaine = new Array(7); semaine[0] = "dimanche"; semaine[1] = "lundi"; semaine[2] = "mardi"; semaine[3] = "mercredi"; semaine[4] = "jeudi"; semaine[5] = "vendredi"; semaine[6] = "samedi"; document.write(semaine[4]); //--> </script> </body></html>
Le code ci-haut contient les balises html. Pour
le tester, vous n'avez qu'à le sélectionner, le
copier ( Edition / Copier ) puis le coller dans
un éditeur de texte ( Edition / Coller )
comme le Bloc-notes de Windows.
Vous enregistrez ensuite le fichier au format html ( .htm
ou .html ). Dans la zone Type de fichier de la boîte
de dialogue Enregistrer sous, choisissez Tous (*.*)
plutôt que Document texte. Ceci afin d'éviter que
votre éditeur n'ajoute l'extension .txt à votre
fichier.
Tous les autres exemples de cette page ne contiendront pas
les balises html. Enregistrez donc votre fichier et servez
vous en comme modèle pour les autres scripts.
Ou encore utilisez ce code html de page vide comme modèle :
<html><head>
<title>Titre de votre page</title>
</head><body>
<!-- Corps du texte --
vous insérez le script
après ce commentaire -->
</body></html>
On peut aussi déclarer le tableau en passant les données en paramètres à l'intérieur des parenthèses. De cette façon, vous itinialisez le tableau tout en définissant sa taille.
semn = new Array("dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi")
Exemple 2 :
Le script suivant affiche la valeur de semn à l'indice 2 :
<script language="javascript" type="text/javascript">
<!--
semn = new Array("dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi");
document.write(semn[2]);
//-->
</script>
On peut se passer de la commande new Array( ) en initialisant directement la variable comme un tableau en plaçant la série de valeurs entre crochets ( [ et ] ). Celà a pour effet d'initialiser la variable en tant que tableau et d'en définir la taille.
joursem = ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]
Exemple 3 :
Le script suivant affiche la valeur de joursem à
l'indice 6 :
<script language="javascript" type="text/javascript"> <!-- joursem = ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]; document.write(joursem[6]); //--> </script>
Notez que dans chacun des exemples ci-haut, le premier indice est toujours 0 ( zéro ) et ce peu importe la méthode utilisée pour déclarer et initialiser le tableau.
On peut également déclarer des tableaux destinés à contenir des valeurs numériques de la même manière que pour les tableaux contenant des chaînes. Les trois exemples suivants sont des manières valides de déclarer des tableaux numériques et de les initialiser.
| 1. | montableau = new Array(3); montableau[0] = 1; montableau[1] = 2; montableau[2] = 3; montableau[3] = 4; |
| 2. | tableau = new Array(1,2,3,4) |
| 3. | tablnum = [1,2,3,4] |
Les trois manières auront le même résultat.
Notez que les valeurs numériques n'ont
pas à être placées entre guillemets qui sont
réservés au valeurs de chaînes (objets String).
Notez aussi qu'un tableau peut contenir à la fois
des données numériques et des chaînes de
caractères.
untableau = ["Isabelle",44,"Yves",47]
| Tables des matières | Rubrique suivante |
Il est possible de scinder ( découper ) une chaîne de caractères en pour placer chacune des parties dans un tableau. Il suffit d'utiliser la méthode split() de l'objet String.
parties = "Ceci est une chaîne".split(" ")
Le caractère placé en argument ( entre les parenthèses ) sert à indiquer où se fait la séparation. Ici, il s'agit d'un espacement. Le tableau suivant est automatiquement créé.
parties[0] contenant "Ceci"
parties[1] contenant "est"
parties[2] contenant "une"
parties[3] contenant "chaîne"
Notez que le caractère d'espacement ayant servi à
la séparation n'apparaît dans aucune des chaînes
crées dans le tableau parties.
Le paramètre de la fonction split() doit être une
expression régulière ( ou RegExpObj pour Regular Expression
Object ). Une expression régulière valide doit
être soit une chaîne de caractères ( un
ou plusieurs caractères placés entre guillemets )
ou une variable contenant une chaîne de caractères.
Il est possible de concaténer les éléments d'un tableau en utilisant la méthode join() de l'objet Array. L'argument entre parenthèses est un caractère ou une chaîne de caractères ( entre guillemets ). Si l'expression ( caractère ou chaîne ) est omis, il sera automatiquement remplacé par une virgule.
chaineOriginale = parties.join(" ")
chaineOriginale qui contient "Ceci est une chaîne"
chaineOriginale = parties.join()
chaineOriginale qui contient "Ceci,est,une,chaîne"
| Script | Effet |
|---|---|
<script language="javascript" type="text/javascript">
<!--
parties = "Ceci est une chaîne".split(" ");
document.write(parties[0] + "<br>");
document.write(parties[1] + "<br>");
document.write(parties[2] + "<br>");
document.write(parties[3] + "<br>");
document.write(parties.join() + "<br>");
document.write(parties.join(" ") + "<br>");
//-->
</script>
|
|
Notez la syntaxe HTML du caractère accentué î : î
Les manipulations de chaînes de ce types peuvent paraître inutiles puisqu'il existe déjà des fonctions ( méthodes ) de manipulations de chaînes qui font le même travail. Par contre, les méthodes split() et join() trouvent toute leur utilité lors de la cueillette d'informations provenant d'un formulaire. Mais ça, c'est un autre chapitre...
| Tables des matières | Rubrique suivante |
On peut trier un tableau en utilisant la méthode sort(). Cette méthode crée un nouveau tableau dont les éléments sont triés par ordre alphabétique. J'entends par nouveau tableau que la version originale du tableau sera écrasée par la version triée. Il est donc prudent, avant de trier un tableau de déterminer si l'ordre présent dans le tableau a ou non une quelconque importance et, si oui, de faire une copie du tableau et de trier la copie plutôt que l'original. Nous verrons en détails au point 8 comment s'effectue le tri et quel effet a ce tri sur les variables de tableaux.
Considérez l'exemple suivant :
noms = new Array(4); noms[0] = "Charles-Henri de Saint-Éleuthère"; noms[1] = "Charles Lokolm"; noms[2] = "Arlette Zébline"; noms[3] = "Prudence Ovolan"; noms_tries = noms.sort();
La dernière instruction place une copie du tableau trié noms dans le nouveau tableau noms_tries.
| Script | Effet |
|---|---|
<script language="javascript" type="text/javascript"> |
|
Je vous ai fait grâce pour cette fois de la syntaxe HTML des caractères accentués. J'ai cependant poussé une petite boucle for... in ( qui renvoie chaque indice d'une collection d'objets, ici les éléments du tableau ) et qui permet, entre autres, d'appeler chacune des données d'un tableau sans avoir à les nommer toutes systématiquement. Amusant ! non ? Remarquez aussi comment l'ajout de commentaires rend plus facile la lecture le repérage des différentes parties du code
Ça se complique un peu lorsque l'on veut trier des données numériques. Comme nous l'avons vu précédemment, la méthode sort() trie alphabétiquement. Ce qui veut dire que chiffres et lettres sont traités comme des caractères. Donc, les nombres sont triés en ordre alphabétique plutôt que numérique.
Par exemple, le tableau suivant
tableau = [100,12,10]
s'il était trié avec sort()
tableau.sort()
équivaudrait à le réinitialiser comme ceci :
tableau = [10,100,12]
ce qui n'a rien à voir avec un tri numérique. Car
lorsqu'on trie un tableau contenant des valeurs numériques,
on s'attend à le retrouver en ordre ! N'est-ce pas ?
Avant de procéder au tri numérique, finissons-en avec le tri alphabétique. L'exemple suivant montre comment la méthode sort() fait le tri dans un tableau contenant toutes sortes de données.
| Script | Effet |
|---|---|
<script language="javascript" type="text/javascript">
|
|
Remarquez comment le tri s'est effectué et comment le tableau donnees a été modifié dans l'opération. Nous reviendront plus loin sur ce second point.
Lors du tri, les chaînes débutant avec une ou plusieures espaces1 sont placés au début ( on ne peut le voir vraiment ici puisque le navigateur supprime les espaces en début de ligne ). Viennent ensuite les chiffres. La chaîne débutant avec 3 suivi d'une espace est placé devant les autre nombres commençant par 3 puisque les nombres sont traités comme des chaînes. Ainsi, les 3 suivis de zéro(s) viennent avant les 3 suivis d'autres chiffres comme le nombre 33. Veinnent ensuite les lettres majuscules. Elles sont toutes classés avant les minuscules, i.e. Z vient avant a. Et finalement, le caractère de soulignement vient après les majuscules et avant les minuscules. On en a fini avec l'ordre de classement. Ouf !
J'ai aussi fait exprès de trier directement le tableau vers un autre tableau pour en vérifier l'effet. Comme nous l'avions vu précédemment, la méthode sort() trie bel et bien le tableau même si l'on envoie le tri vers une autre variable de tableau. L'exemple suivant montre comment le fait de copier le tableau et trier la copie permet de préserver l'ordre original des données d'un tableau.
| Script modifié | Effet |
|---|---|
| Voici la portion de script qu'il faut modifier entre l'initialisation des données et l'affichage des tableaux :
/* Copie du tableau donnees vers enordre */
enordre = new Array();
for (i in donnees)
{
enordre[i] = donnees[i];
}
i = 0; //réinitialise i pour la prochaine boucle
/* Tri de enordre */
enordre.sort();
|
|
Cette fois, le tableau donnees est resté intact alors
que la copie ( enordre ) a bien été triée.
Attention toutefois, vous ne pourriez copier le tableau donnees vers
enordre en utilisant l'instruction
enordre = donnees
car ceci crérait une "liaison" entre les deux tableaux. Par la
suite, le simple fait de trier enordre aurait pour effet de
trier donnees aussi. Ce qui s'est produit
dans l'exemple utilisant l'instruction
enordre = donnees.sort()
est légèrement différent. Le tableau
donnees a été trié puis copié vers
le tableau enordre.
Pour trier numériquement un tableau, il faut passer une fonction en paramètre à la méthode sort(). En fait la fonction doit être programmée car il n'existe pas de paramètres prédéfini pour la méthode sort(). Celà permet aussi de déterminer le critère de tri selon vos propres besoins mais nécessite aussi un minimum de connaissances en programmation JavaScript.
Nous allons donc créer une fonction comparant deux à deux les éléments d'un tableau et nous en servir comme critère de tri en la passant comme argument dans la méthode sort().
function comparerNombres(a,b)
{
return a-b;
}
Cette fonction est ( sauf pour le nom ) identique à la fonction que vous trouverez à la page 89 du livre JavaScript 1.5 aux éditions CampusPress. Vous la retrouverez aussi dans les références JavaScript 1.5 sur le site http://devedge.netscape.com/, à la section Array du premier chapitre, dans les explications de la méthode sort(). Voir l'adresse complète au bas de la page. Vous trouverez aussi à cette adresse, les explications détaillées sur l'ordre de tri. En anglais... Quant à la fonction qui nous occupe :
a - b est négative
alors b est placé avant a.a - b est positive,
b est placé après a.a - b est égale
à 0 ( zéro ), a et b
sont placé dans l'ordre où ils ont
été trouvés respectivement l'un par
rapport à l'autre.Voyons un peu ce que celà donne dans la pratique :
| Script avec un tableau uniquement numérique | Effet obtenu |
|---|---|
<script language="javascript" type="text/javascript">
|
|
Pour trier les tableau d'une manière alpha-numérique en respectant à la fois l'ordre alphabétique et l'ordre numérique, il faudra créer un fonction différente tenant compte du type de données contenues dans le tableau. Mais ça, c'est une autre histoire...
| Tables des matières | Rubrique suivante |
1.
Selon Le français au
bureau, Guides de l'Office de la langue française
gouvernement du Québec, 1996 :
« Le mot espace est traditionnelement du genre féminin
en typographie. Dans la langue générale, au
sens de " mesure de ce qui sépare deux points, deux
objets ", donc aussi bien deux lettres ou deux mots, on emploie
espace au masculin. »
J'aime bien la tradition en typographie. Vous avez sans doute
remarqué, je crois.
Retour