IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Tri sur plusieurs champs d'un tableau contenant des objets


Sujet :

JavaScript

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre confirmé Avatar de the-destroyer
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 204
    Par défaut
    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 ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ^^

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Essaye comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ou plus compact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    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 ?

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Tri sur plusieurs champs dans zone de liste
    Par Orakle dans le forum IHM
    Réponses: 3
    Dernier message: 18/06/2009, 09h12
  2. Réponses: 2
    Dernier message: 06/09/2007, 15h08
  3. [SQL SERVER ] Tri sur plusieurs champs
    Par fantomchris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/07/2006, 17h59
  4. Comment faire un Tri sur plusieurs champs
    Par guile153 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2006, 12h52
  5. [Collection] Tris sur plusieurs champs
    Par partyboy dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 12/07/2005, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo