Slaughter: Objekt nach Namen sortieren

Hallo,

ich habe folgendes Objekt vorliegen und möchte die Ausgabe nach dem Namen der Abteilung(z.B. angebotserstellung ) sortieren. Leider habe ich keine Idee, wie das über "sort()" funktionieren soll. Ich hoffe es kann mir jemand weiterhelfen.

firma.angebotserstellung.erledigt=10;
firma.auftragsannahme.erledigt=6;
firma.auftragsbearbeitung.erledigt=5;
firma.versand.erledigt=4;

var test="";
for ( var abteilung in firma ){
   test+=abteilung +" -> "+ eval("firma."+abteilung+".erledigt");
}
alert(test);

Gruß

Slaughter

  1. Hi,

    ich habe folgendes Objekt vorliegen und möchte die Ausgabe nach dem Namen der Abteilung(z.B. angebotserstellung ) sortieren. Leider habe ich keine Idee, wie das über "sort()" funktionieren soll.

    indem Du die Namen zunächst in ein Array speicherst, auf welches eine sort()-Methode angewendet werden kann.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. indem Du die Namen zunächst in ein Array speicherst, auf welches eine sort()-Methode angewendet werden kann.

      Cheatah

      Hallo,

      zunächst vielen Dank, aber das ist hoffentlich nicht die einzige Variante.

      Gruß

      Slaughter

      1. zunächst vielen Dank, aber das ist hoffentlich nicht die einzige Variante.

        Doch.

        Struppi.

      2. Hi,

        indem Du die Namen zunächst in ein Array speicherst, auf welches eine sort()-Methode angewendet werden kann.
        zunächst vielen Dank, aber das ist hoffentlich nicht die einzige Variante.

        aber nein. Du kannst selbstverständlich über den prototype-Ansatz dem Object-Objekt eine sort()-Methode verpassen, die die Sortierung übernimmt. Natürlich muss diese dann zunächst alle Namen in ein Array speichern, auf welches eine sort()-Methode angewendet werden kann.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. var test="";
    for ( var abteilung in firma ){
       test+=abteilung +" -> "+ eval("firma."+abteilung+".erledigt");

    ... und das eval ist hier völlig überflüssig

    test += abteilung + " -> " + firma[abteilung].erledigt;

    Struppi.

  3. Hallo,

    Objekte in JavaScript (ECMAScript Edition 3) sind Listen von Name-Werte-Paaren, eine Ordnung existiert nicht. (Dass bei manchen Interpretern beim Durchlaufen mit for-in zufällig die Reihenfolge herauskommt, mit der die Objekteigenschaften gesetzt wurden, ist keine Vorschrift.)

    Willst du eine Liste mit Rangordnung, dann sind immer Arrays zu gebrauchen. In deinem Fall könntest du eine Liste von Objects bilden und eine eigene Sortierungsfunktion, die mit dem Namen operiert, der als String in einer Eigenschaft dieses Objects drinsteht:

    var arr = [  
      { name : "auftragsannahme", erledigt : 6 },  
      { name : "versand", erledigt : 4 },  
      { name : "auftragsbearbeitung", erledigt : 5 },  
      { name : "angebotserstellung", erledigt : 10 }  
    ];  
      
    arr.sort(function (a, b) {  
      if (a.name < b.name)  
        return -1;  
      if (a.name > b.name)  
        return 1;  
      return 0;  
    });  
      
    for (var i = 0; i < arr.length; i++) {  
      document.write("<div>" + arr[i].name + " - " + arr[i].erledigt + "<\/div>");  
    }
    

    Die automatische Umwandlung vom Object in den Array mit Objects ist natürlich möglich: Man durchläuft das firma-Object und erzeugt für jede Eigenschaft ein Object. Dies füllt man mit dem Namen sowie allen Eigenschaften des Unterobjekts, die man auch über eine for-in-Schleife bekommt.

    Mathias

    1. gruss Mathias, hallo Schlachtung/Metzelei,

      ...
      Willst du eine Liste mit Rangordnung, dann sind immer Arrays zu gebrauchen.
      In deinem Fall könntest du eine Liste von Objects bilden und eine eigene
      Sortierungsfunktion, die mit dem Namen operiert, der als String in einer
      Eigenschaft dieses Objects drinsteht:

      var arr = [

      { name : "auftragsannahme", erledigt : 6 },
        { name : "versand", erledigt : 4 },
        { name : "auftragsbearbeitung", erledigt : 5 },
        { name : "angebotserstellung", erledigt : 10 }
      ];

      volle zustimmung.

      ...
      Die automatische Umwandlung vom Object in den Array mit Objects ist
      natürlich möglich: ...

      ... waere hier aber zuviel des guten, ...

      ... Man durchläuft das firma-Object und erzeugt für
      jede Eigenschaft ein Object. Dies füllt man mit dem Namen sowie allen
      Eigenschaften des Unterobjekts, die man auch über eine for-in-Schleife
      bekommt.

      ... denn falls Slaughter die datenstruktur nicht aendern kann, bevor sich
      diese im client in der von ihm vorgestellten form manifestiert, ist er
      gezwungen, mit »for in« zu iterieren. und dann kann er die ausgabe auch
      gleich ohne den umweg einer transformation erstellen.

      desweiteren sollte diese objekt-iteration mit der methode [link:http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object:hasOwnProperty@title=[hasOwnProperty]]
      abgefedert werden.

      moegliche beispielhafte loesung, wie sie von Cheatah und Struppi
      angesprochen wurde:

      [code lang=javascript](function () {

      var company = {

      auftragsbearbeitung: {
         completed: 5
        },
        versand: {
         completed: 4
        },
        auftragsannahme: {
         completed: 6
        },
        angebotserstellung: {
         completed: 10
        }
       };

      var log = "", itemName, itemNames = [];
       for (itemName in company) {

      if (company.hasOwnProperty(itemName)) {

      itemNames.push(itemName);
        }
       }
       itemNames.sort(/*function (a, b) {

      return ((a < b) ? (-1) : ((a > b) ? (1) : (0)));

      }/).forEach(function (str/, idx, arr*/) {

      log += (str + ".completed : " + company[str].completed + "\n");
       });

      alert(log);

      })();/*

      obigen code in einem halbwegs modernen gecko (wegen [forEach])
      einfach mal nach [[link:http://www.squarefree.com/shell/shell.html]]
      pasten und bestaetigen.

      */

        
        
      ... und ja, man kann sich nicht in jedem fall darauf verlassen, dass  
      [hasOwnProperty] oder array-iteratoren dem client zur verfuegung stehen.  
      genannte methoden lassen sich aber abpruefen und nachimplementieren.  
        
        
        
      so long - peterS. - pseliger@gmx.net  
        
        
      
      -- 
      »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
      Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)  
        
      [ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:\]](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%28+fl%3A%29+br%3A%3E+va%3A%28+ls%3A%26+fo%3A%29+rl%3A%29+n3%3B%7D+n4%3A%7D+ss%3A%7D+de%3A%B5+js%3A%7D+mo%3A%3F+zu%3A%5D)
      
      1. Hallo,

        moegliche beispielhafte loesung, wie sie von Cheatah und Struppi
        angesprochen wurde:

        Stimmt. Ich war dumm. Eine volle Umwandlung ist natürlich unnötig. Es reicht, die Namen zu extrahieren und zu sortieren, dann wieder das ursprüngliche Objekt zu durchlaufen.

        Mathias