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
    var arr = [];
    
    for (var k in Players) {
        arr[Players[k].id] = Players[k];
    }
    
    arr.sort(function(a,b) { return a.score - b.score;});
    
    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
    arr.sort(function(a,b) { return a.score - b.score;});
  • Schon, aber mit der letzten Zeile

    Code
    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
    var arr = [];
    for (var k in Players) {
        arr[Players[k].id] = Players[k];
    }

    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
            var arr = [];
            for (var k in Players) {
                arr.push(Players[k]);
            }

    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
    var oSortedObject = {};
    var aSortedKeys = Object.keys(obj).sort( (a, b) => { return obj[a].score - obj[b].score; } );
    
    for ( var k in aSortedKeys )
      oSortedObject[aSortedKeys[k]] = obj[aSortedKeys[k]]
  • Was ein Chaos ^^

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

    Lösung:

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

    Vielen Dank für eure Hilfe :thumbup:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!