Objekt nach Namen sortieren
Slaughter
- javascript
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
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
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
zunächst vielen Dank, aber das ist hoffentlich nicht die einzige Variante.
Doch.
Struppi.
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
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.
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
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)
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