Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/06/2011, 16h28   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 36
Points : 4
Points : 4
Par défaut Tri sur plusieurs champs d'un tableau contenant des objets

Bonjour à tous ^^

Quelqu'un saurait-il me dire, si c'est possible, comment on peut trier un tableau contant des objets de même type en fonction de plusieurs champs de ces objets.

J'ai par exemple un objet Commerce avec ses champs tel que :
Code :
1
2
3
4
5
6
7
8
 
function Commerce(numInd, codeRegion, codeSecteur, codeClient, nomCommerce) 
{ 
        this.codeRegion = codeRegion; 
        this.codeSecteur = codeSecteur; 
	this.codeClient = codeClient;
	this.nomCommerce= nomCommerce;
}
Je parviens à trier sur un seul champs (par exemple nomCommerce) en faisant ceci :
Code :
1
2
3
4
5
6
7
 
tabCommerces.sort(trierCommercesParNom);
 
function trierCommercesParNom(a, b)
{
	return (a.nomCommerce> b.nomCommerce) ? 1 : -1;
}
Ce que je voudrais pouvoir faire, c'est trier une première fois sur le codeRegion, puis sur le codeSecteur et enfin sur le nomCommerce.

Quelqu'un aurait-il une solution à me proposer ?

Merci d'avance
swampsnake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 00h37   #2
Membre régulier
 
Avatar de the-destroyer
 
Homme
Lycéen
Inscription : mars 2009
Messages : 201
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 17
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : mars 2009
Messages : 201
Points : 80
Points : 80
Salut !

Si j'ai bien compris, tu veux 'trier' ton tableau, c'est a dire supprimer un élément a une certaines condition c'est ca ?
the-destroyer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 10h10   #3
Invité de passage
 
Inscription : novembre 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 36
Points : 4
Points : 4
Non, en fait, ce que je veux, c'est ordonner les objets contenus dans mon tableau en fonction des trois champs que j'ai mentionnés.

Par exemple :

Code :
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
 
// Initialisation des objets Commerces
var com1 = new Commerce("12345", "04000", "04W44", "120127", "Magasin1");
var com2 = new Commerce("98765", "04002", "04W48", "120280", "Boutique2");
var com3 = new Commerce("52463", "04002", "04W42", "120130", "Boutique1");
var com4 = new Commerce("18954", "04003", "04W49", "120002", "Echoppe2");
var com5 = new Commerce("49731", "04003", "04W42", "120048", "Magasin2");
var com6 = new Commerce("82713", "04001", "04W41", "120640", "Echoppe1");
var com7 = new Commerce("64972", "04001", "04W44", "120145", "Magasin3");
var com8 = new Commerce("53198", "04002", "04W44", "120639", "Echoppe3");
var com9 = new Commerce("25645", "04001", "04W41", "120478", "Echoppe4");
var com10 = new Commerce("32145", "04003", "04W49", "120987", "Magasin4");
 
 
// Insertion des objets dans le tableau (peu importe l'ordre en réalité)
tabCommerces.push(com1);
tabCommerces.push(com2);
tabCommerces.push(com3);
tabCommerces.push(com4);
tabCommerces.push(com5);
tabCommerces.push(com6);
tabCommerces.push(com7);
tabCommerces.push(com8);
tabCommerces.push(com9);
tabCommerces.push(com10);
Après le tri, il faudrait que les objets dans le tableau soit rangé dans l'ordre croissant en fonction du codeRegion, du codeSecteur et en fin du nomCommerce.

Après le tri sur codeRegion, on devrait avoir ceci (pour les 10 objets ci-dessus) :

tabCommerces[0] = com1
tabCommerces[1] = com6
tabCommerces[2] = com7
tabCommerces[3] = com9
tabCommerces[4] = com2
tabCommerces[5] = com3
tabCommerces[6] = com8
tabCommerces[7] = com4
tabCommerces[8] = com5
tabCommerces[9] = com10

Puis on tri sur sur codeSecteur. On devrait avoir ceci :

tabCommerces[0] = com1
tabCommerces[1] = com6
tabCommerces[2] = com9
tabCommerces[3] = com7
tabCommerces[4] = com3
tabCommerces[5] = com8
tabCommerces[6] = com2
tabCommerces[7] = com5
tabCommerces[8] = com4
tabCommerces[9] = com10

Enfin on tri sur sur nomCommerce. On devrait avoir ceci pour finir :

tabCommerces[0] = com1
tabCommerces[1] = com6
tabCommerces[2] = com9
tabCommerces[3] = com7
tabCommerces[4] = com3
tabCommerces[5] = com8
tabCommerces[6] = com2
tabCommerces[7] = com5
tabCommerces[8] = com4
tabCommerces[9] = com10

J'avais essayé de faire ceci pour trier mon tableau : je répète trois fois un tri par insertion :
Code :
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
 
tabCommerces = trier(tabCommerces);
 
function trier(tab)
{
	// Tri sur le codeRegion
	for (var i = 1; i <= tab.length; i++)
	{
		var j = i;
 
		while (j > 0 && tab[j - 1].codeRegion > tab[j].codeRegion)
		{
			tab[j] = tab[j - 1];
			j--;
		}
 
		tab[j] = tab[i];
	}
 
	// Tri sur le codeSecteur
	for (var i = 1; i <= tab.length; i++)
	{
		var j = i;
 
		while (j > 0 && tab[j - 1].codeSecteur > tab[j].codeSecteur)
		{
			tab[j] = tab[j - 1];
			j--;
		}
 
		tab[j] = tab[i];
	}
 
	// Tri sur le nomCommerce
	for (var i = 1; i <= tab.length; i++)
	{
		var j = i;
 
		while (j > 0 && tab[j - 1].nomCommerce > tab[j].nomCommerce)
		{
			tab[j] = tab[j - 1];
			j--;
		}
 
		tab[j] = tab[i];
	}
 
        return tab;
}
Mais j'ai une erreur : "codeRegion a la valeur null ou n'est pas un objet" dans la fonction. Par ailleurs, je ne sais pas si cette solution de tri fonctionnerait dans mon cas.

J'espère que j'ai été assez clair ^^
swampsnake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 10h38   #4
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 797
Points : 35 797
Essaye comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function tri(a,b){
	// Si codeRegion différent
	if(a.codeRegion != b.codeRegion){
		return (a.codeRegion> b.codeRegion) ? 1 : -1;
	}
	// Sinon si codeSecteur différent
	if(a.codeSecteur != b.codeSecteur){
		return (a.codeSecteur> b.codeSecteur) ? 1 : -1;
	}
	// Sinon si nomCommerce différent
	if(a.nomCommerce != b.nomCommerce){
		return (a.nomCommerce> b.nomCommerce) ? 1 : -1;
	}
	// Sinon retourne 0
	return 0;
}
tabCommerces.sort(tri);
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 10h42   #5
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 797
Points : 35 797
Ou plus compact :
Code :
1
2
3
4
5
6
7
8
9
10
function tri(a,b){
	var criteres;
	for(criteres in ['codeRegion', 'codeSecteur', 'nomCommerce']){
		if(a[criteres] != b[criteres]){
			return a[criteres] > b[criteres] ? 1 : -1;
		}
	}
	return 0;
}
tabCommerces.sort(tri);
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h12   #6
Invité de passage
 
Inscription : novembre 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 36
Points : 4
Points : 4
Merci Bovino

Ta solution compacte ne fonctionne pas, par contre ta première solution fonctionne parfaitement.

Encore merci ^^

Je suppose que je peux reproduire ce genre de tri avec n champs d'un objet ou bien y a-t-il une limite ?
swampsnake est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 13h14   #7
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 797
Points : 35 797
Citation:
Envoyé par swampsnake
Ta solution compacte ne fonctionne pas
Au temps pour moi, criteres dans la boucle correspond aux indices, pas aux valeurs
Code :
1
2
3
4
5
6
7
8
9
10
function tri(a,b){
	var critere, criteres = ['codeRegion', 'codeSecteur', 'nomCommerce'];
	for(critere in criteres){
		if(a[criteres[critere]] != b[criteres[critere]]){
			return a[criteres[critere]] > b[criteres[critere]] ? 1 : -1;
		}
	}
	return 0;
}
tabCommerces.sort(tri);
Citation:
Envoyé par swampsnake
Je suppose que je peux reproduire ce genre de tri avec n champs d'un objet
oui, tout à fait
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h48.


 
 
 
 
Partenaires

Hébergement Web