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

Flash Discussion :

[flash8] Array.sortOn ("maPropriete.maSousPropriete")


Sujet :

Flash

  1. #1
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut [flash8] Array.sortOn ("maPropriete.maSousPropriete")
    Bonjour,
    J'ai un petit soucis quand j'essaye de trier un tableau par sortOn.
    En effet, mon tableau contient des objet (un noeud xml), et je voudrais le trier par un attribut de ce noeud. J'ai donc écris
    Code Action Script : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nodePagesTrie_a=nodePages.sortOn("attributes.ordre");
    Comme vous vous en doutez, ca ne marche pas... et je vois pas pourquoi?!

  2. #2
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    J'ai tenté autre chose, avec sort(fonction_de_tri)... ca marche pas non plus!!
    Il rentre même pas dans la fonction?!

    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
     
    function order(a, b):Number {
    	trace("qsdf");
    	trace(a.attributes.ordre);
    	var ordreA:Number = a.attributes.ordre;
    	var ordreB:Number = b.attributes.ordre;
    	if (ordreA<ordreB) {
    	  return -1;
    	} else if (ordreA>ordreB) {
    	  return 1;
    	} else {
    	  return 0;
    	}
    }
     
    //Ici, on trie le tableau des pages pour que l'affichage se fasse selon le numéro d'ordre
    var nodePagesTrie_a:Array=new Array();
    nodePagesTrie_a=nodePages_a.sort(order);

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    En principe si j'ai bien compris t'as un simple tableau avec des noeuds xml dedans (c'est à dire un noeud par element du tableau, j'imagine)

    Lorsque je regarde l'aide sur F1 je trouve tout ceci:

    sortOn (méthode Array.sortOn)
    public sortOn(fieldName:Object, [options:Object]) : Array

    Trie les éléments d'un tableau selon un ou plusieurs champs du tableau. Le tableau doit être doté des caractéristiques suivantes :

    Le tableau est indexé et non associatif.
    Chaque élément du tableau contient un objet doté d'une ou de plusieurs propriétés.
    Tous les objets ont au moins une propriété en commun dont les valeurs peuvent être utilisées pour trier le tableau. Ce type de propriété est connu sous le nom de champ.
    Si vous transmettez plusieurs paramètres fieldName, le premier champ représente le champ de tri principal, le deuxième représente le champ de tri suivant, etc. Flash trie selon les valeurs Unicode. (ASCII est un sous-ensemble de Unicode.) Si l'un des éléments comparés ne contient pas le champ spécifié dans le paramètre fieldName, le champ est considéré comme étant undefined et les éléments sont placés de manière consécutive dans le tableau trié dans un ordre quelconque.

    Par défaut, Array.sortOn() fonctionne de la façon suivante :

    Le tri tient compte de la casse (Z précède a).
    Le tri est ascendant (a précède b).
    Le tableau est modifié afin de refléter l'ordre de tri ; plusieurs éléments, dont les champs de tri sont identiques, sont placés de manière consécutive dans le tableau trié dans un ordre quelconque.
    Les champs numériques sont triés comme s'il s'agissait de chaînes : ainsi, 100 précède 99 car " 1 " est une valeur de chaîne inférieure à " 9 ".
    Flash Player 7 a jouté le paramètre options que vous pouvez utiliser pour annuler le comportement de tri par défaut. Pour trier un tableau simple (par exemple, un tableau contenant un seul champ) ou pour spécifier un ordre de tri non pris en charge par le paramètre options, utilisez Array.sort().

    Pour définir plusieurs indicateurs, séparez-les à l'aide de l'opérateur OR (|) au niveau du bit :

    my_array.sortOn(someFieldName, Array.DESCENDING | Array.NUMERIC);
    La fonctionnalité ajoutée à Flash Player 8 permet de spécifier une option de tri différente pour chaque champ lors d'un tri selon plusieurs champs. Dans Flash Player 8, le paramètre options accepte un tableau d'options de tri de telle sorte que chaque option de tri correspond à un champ de tri dans le paramètre fieldName. L'exemple suivant trie le champ de tri principal, a, selon un tri décroissant, le deuxième champ de tri, b, selon un tri numérique et le troisième champ de tri, c, selon un tri non sensible à la casse :

    Array.sortOn (["a", "b", "c"], [Array.DESCENDING, Array.NUMERIC, Array.CASEINSENSITIVE]);
    Remarque : Les tableaux fieldName et options doivent contenir le même nombre d'éléments ; sinon, le tableau options est ignoré. En outre, les options Array.UNIQUESORT et Array.RETURNINDEXEDARRAY ne peuvent être utilisées qu'en tant que premier élément du tableau, sinon elles sont ignorées.

    Disponibilité : ActionScript 1.0 ; Flash Player 6

    Paramètres
    fieldName:Object - Une chaîne identifiant un champ à utiliser en tant que valeur de tri ou un tableau dans lequel le premier élément représente le champ de tri principal, le deuxième le champ de tri secondaire, etc.

    options:Object [facultatif] - Un ou plusieurs nombres ou noms de constantes définies, séparés par l'opérateur bitwise OR (|), ce qui remplace le comportement de tri. Les valeurs suivantes sont valides pour le paramètre options :

    Array.CASEINSENSITIVE ou 1
    Array.DESCENDING ou 2
    Array.UNIQUESORT ou 4
    Array.RETURNINDEXEDARRAY ou 8
    Array.NUMERIC ou 16
    Les conseils de code sont activés si vous utilisez le format chaîne de l'indicateur (par exemple, DESCENDING) au lieu du format numérique (2).

    Renvoie
    Array - La valeur de renvoi dépend du fait que vous transmettiez ou non des paramètres :

    Si vous spécifiez une valeur de 4 ou Array.UNIQUESORT pour le paramètre options et si au moins deux éléments triés ont des champs de tri identiques, la valeur 0 est renvoyée et le tableau n'est pas modifié.
    Si vous spécifiez une valeur de 8 ou Array.RETURNINDEXEDARRAY pour le paramètre options, un tableau qui reflète les résultats du tri est renvoyé et le tableau n'est pas modifié.
    Dans le cas contraire, Flash ne renvoie rien et modifie le tableau pour refléter l'ordre de tri.
    Exemple
    L'exemple suivant crée un nouveau tableau et le trie selon les champs name et city. Le premier tri utilise name en tant que première valeur de tri et city en tant que deuxième valeur de tri. Le deuxième tri utilise city en tant que première valeur de tri et name en tant que deuxième valeur de tri.

    var rec_array:Array = new Array();
    rec_array.push({name: "john", city: "omaha", zip: 68144});
    rec_array.push({name: "john", city: "kansas city", zip: 72345});
    rec_array.push({name: "bob", city: "omaha", zip: 94010});
    for(i=0; i<rec_array.length; i++){
    trace(rec_array[i].name + ", " + rec_array[i].city);
    }
    // Results:
    // john, omaha
    // john, kansas city
    // bob, omaha

    rec_array.sortOn(["name", "city"]);
    for(i=0; i<rec_array.length; i++){
    trace(rec_array[i].name + ", " + rec_array[i].city);
    }
    // Results:
    // bob, omaha
    // john, kansas city
    // john, omaha

    rec_array.sortOn(["city", "name" ]);
    for(i=0; i<rec_array.length; i++){
    trace(rec_array[i].name + ", " + rec_array[i].city);
    }
    // Results:
    // john, kansas city
    // bob, omaha
    // john, omaha
    Le tableau d'objets suivant est utilisé par les exemples suivants, qui montrent comment utiliser le paramètre options :

    var my_array:Array = new Array();
    my_array.push({password: "Bob", age:29});
    my_array.push({password: "abcd", age:3});
    my_array.push({password: "barb", age:35});
    my_array.push({password: "catchy", age:4});
    La réalisation d'un tri par défaut à partir du champ du mot de passe donne les résultats suivants :

    my_array.sortOn("password");
    // Bob
    // abcd
    // barb
    // catchy
    La réalisation d'un tri non sensible à la casse à partir du champ du mot de passe donne les résultats suivants :

    my_array.sortOn("password", Array.CASEINSENSITIVE);
    // abcd
    // barb
    // Bob
    // catchy
    La réalisation d'un tri décroissant non sensible à la casse à partir du champ du mot de passe donne les résultats suivants :

    my_array.sortOn("password", Array.CASEINSENSITIVE | Array.DESCENDING);
    // catchy
    // Bob
    // barb
    // abcd
    La réalisation d'un tri par défaut à partir du champ âge donne les résultats suivants :

    my_array.sortOn("age");
    // 29
    // 3
    // 35
    // 4
    La réalisation d'un tri numérique à partir du champ âge donne les résultats suivants :

    my_array.sortOn("age", Array.NUMERIC);
    // my_array[0].age = 3
    // my_array[1].age = 4
    // my_array[2].age = 29
    // my_array[3].age = 35
    La réalisation d'un tri numérique décroissant à partir du champ âge donne les résultats suivants :

    my_array.sortOn("age", Array.DESCENDING | Array.NUMERIC);
    // my_array[0].age = 35
    // my_array[1].age = 29
    // my_array[2].age = 4
    // my_array[3].age = 3
    Lorsque vous utilisez l'option de tri Array.RETURNEDINDEXARRAY, vous devez affecter la valeur renvoyée à un tableau différent. Le tableau d'origine n'est pas modifié.

    var indexArray:Array = my_array.sortOn("age", Array.RETURNINDEXEDARRAY);
    Voir également
    | Opérateur OR au niveau du bit, sort (méthode Array.sort)

    et si tu as fait un push de ton noeud en entier et pas chacun de tes attributs, c'est normal que ça ne marche pas
    chau

  4. #4
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    J'avais bien lu l'aide, mais bon j'espérais que ça marcherais quand même... Après tout, je pointe bien sur un champ du tableau...
    Et ce que je comprends encore moins, c'est que ma 2ème proposition marche pas.
    Merci quand même de te pencher sur mon problème

  5. #5
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    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
    //Ici, on trie le tableau des pages pour que l'affichage se fasse selon le numéro d'ordre
    var nodePagesTrie_a:Array=new Array();
     
    while (nodePagesTrie_a.length!=nbPage){
    	var max:Number=0;
    	for (var j:Number=0;j<nodePages_a.length;j++){
    		var numOrdre:Number=nodePages_a[j].attributes.ordre;
    		if (numOrdre>max){
    			max=numOrdre;
    			var jMax:Number=j;
    		}
    	}
    	nodePagesTrie_a.push(nodePages_a[jMax]);
    	for (var k=jMax; k<nodePages_a.length-1; k++){
    		nodePages_a[k]=nodePages_a[k+1];
    	}
    	nodePages_a=nodePages_a.slice(0,k);
    }
    nodePagesTrie_a.reverse();
    C'est moche, mais bon ça marche...

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

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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