Gelöst: Objekt Literal sortieren

  • Moinsen,


    ich möchte gerne ein Object Literal nach "score" sortieren.


    Dafür habe ich natürlich schon so einiges bei Google gefunden, nur leider funktioniert es nicht so.

    Ich brauche auf jeden fall ein Object Literal.


    Code
    1. var arr = [];
    2. for (var k in Players) {
    3. arr[Players[k].id] = Players[k];
    4. }
    5. arr.sort(function(a,b) { return a.score - b.score;});
    6. newPlayers = Object.assign({}, arr);
  • Hey,

    das ist mir schon bekannt. Auch den Beitrag auf "stakoverflow" kannte ich schon.
    wie schon erwähnt, habe ich google schon verwendet.


    Zitat


    Einziger Ausweg ist, das Array zu verwenden, das Du ja schon erzeugt hast.

    Mache ich das nicht?

    Code
    1. arr.sort(function(a,b) { return a.score - b.score;});
  • Schon, aber mit der letzten Zeile

    Code
    1. newPlayers = Object.assign({}, arr);

    wandelst Du es wieder in ein Objekt um und hast die selben Probleme, dass die Reihenfolge undefiniert ist. Ich hatte deinen Code so verstanden, dass Du das Array nur als Zwischenergebnis verwendest.

    Ich weiß ja nicht, was Du mit dem Ergebnis vor hast, aber wenn Du eine sortierte Reihenfolge brauchst, musst Du das Array verwenden.

  • PS: Habe jetzt ein wenig getestet und das Problem scheint ein anderes zu sein. Hier:

    Code
    1. var arr = [];
    2. for (var k in Players) {
    3. arr[Players[k].id] = Players[k];
    4. }

    vermengst Du Objekte und Arrays. Bei Array muss der Schlüssel nummerisch sein. Was ich nicht verstehe ist, dass dabei kein Fehler angezeigt wird. Die Console zeigt dieses Konstrukt zwar an, aber mit der Länge 0 und die Sortierung funktioniert nicht, die Callback-Funktion wird nicht aufgerufen.

    Erzeugt man das Array so:

    Code
    1. var arr = [];
    2. for (var k in Players) {
    3. arr.push(Players[k]);
    4. }

    wird es anschließend korrekt sortiert.

  • Das liegt daran, dass bei nicht numerischen Schlüsseln automatisch in ein Objekt gecastet wird:


    Das war quatsch, sorry. Array() wird ja auch als Objekt betrachtet...


    EDIT: Mir fiele dann nur noch eine Zwischenlösung ein.

    JavaScript
    1. var oSortedObject = {};
    2. var aSortedKeys = Object.keys(obj).sort( (a, b) => { return obj[a].score - obj[b].score; } );
    3. for ( var k in aSortedKeys )
    4. oSortedObject[aSortedKeys[k]] = obj[aSortedKeys[k]]
  • Was ein Chaos ^^

    Nach langem hin und her funktioniert es jetzt mit Object.keys()

    Lösung:

    Code
    1. var oSortedObject = {};
    2. var aSortedKeys = Object.keys(Players).sort(function(a,b){return Players[b].score-Players[a].score});
    3. for ( var k in aSortedKeys )
    4. oSortedObject[aSortedKeys[k]] = Players[aSortedKeys[k]]

    Vielen Dank für eure Hilfe :thumbup: