Jens: jscript: Daten sortieren

Hallo,

ich habe einen Datensatz, den ich javascript einlesen und sortieren lassen möchte. Meine Idee wäre die Daten in assoziative Arrays zu importieren. Ein Array würde dann in etwa so aussehen:

var Leg = [
  {
    Dia: "203",
    PC: "AC02",
    Si: 0,51, 
    Mg: 0,49;
    Mn:0,04
  }

Gibt es in JS eine Möglichkeit, die Arrays je nach Benutzeingabe z.B. nach den Werten in Si zu sortieren?

VG Jens

akzeptierte Antworten

  1. @@Jens

    Ein Array würde dann in etwa so aussehen:

    var Leg = [
      {
        Dia: "203",
        PC: "AC02",
        Si: 0,51, 
        Mg: 0,49;
        Mn:0,04
      }
    

    Aber nur in etwa. Das Dezimaltrennzeichen muss – wie in wohl allen Computersprachen – der . sein.

    Ich weiß nicht, ob es für var noch eine sinnvolle Verwendung gibt. Wenn sich das Ding später noch ändern sollte (Spoiler: soll es nicht): let, ansonsten: const.

    Gibt es in JS eine Möglichkeit, die Arrays je nach Benutzeingabe z.B. nach den Werten in Si zu sortieren?

    Ja, gibt es.

    Jolan tru

    --
    Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
    1. Hallo Gunnar,

      ich bin jetzt etwas verwirrt, aber warum soll man ein Array sortieren, dass nur aus einem Element besteht?

      Gruß
      Jürgen

      1. Hallo,

        ich bin jetzt etwas verwirrt, aber warum soll man ein Array sortieren, dass nur aus einem Element besteht?

        vermutlich weil Jens mit seinem Beispiel nicht "ein Array" dargestellt hat, sondern "ein Array, das aus Elementen dieser Struktur besteht".

        Einen schönen Tag noch
         Martin

        --
        Manchmal kann man gar nicht so viel fühlen, wie man denkt.
        Und manchmal fühlt man so viel, dass man gar nicht denken kann.
        1. vermutlich weil Jens mit seinem Beispiel nicht "ein Array" dargestellt hat, sondern "ein Array, das aus Elementen dieser Struktur besteht".

          Ja genau, hab mich wohl etwas missverständlich ausgedrückt.

    2. Super Vielen Dank :-)

    3. Hallo,

      ich habe das ganze jetzt mal ausprobiert und mit folgendem Code klappt es auch super:

      leg.sort((a, b) => a.Si_max - b.Si_max);
      

      Sobald ich aber eine Variable als Parameter verwende funktioniert es nicht mehr.

          let valueA='a.Si_max';
          let valueB='b.Si_max';
          leg.sort((a, b) => valueB - valueA);
      

      Ich komme einfach nicht drauf, was das Problem ist.

      1. Hallo Jens,

        ich habe deine Inline-Codeformatierung (die Du vermutlich mit dem </>-Button erzeugt hast) mal in Blockformatierung geändert. Die kriegt man auch über den </> Button, wenn man mehrere Zeilen markiert.

        Und dabei hab ich gelernt: Man markiere gar nichts und klicke auf </>, dann kommt ein Popup-Dialog für Codeblock-Eingabe, sogar mit Sprachauswahl.

        Zu deiner Frage:

        Ich komme einfach nicht drauf, was das Problem ist.

        Und JavaScript kommt einfach nicht drauf, warum es in einem String nach Code schauen soll. Für die Engine sind das einfach nur Konstanten. Und da es String-Konstanten sind, ergibt der Versuch des Subtrahierens immer NaN (spezielle JavaScript-Konstante für Not A Number).

        Früher™ einmal konnte man eval() für so einen Zweck nutzen. Heutzutage bekommt JavaScript in strict mode eine Schockstarre, wenn es das sieht, und Du solltest sie auch bekommen…

        leg.sort((a, b) => eval(valueB) - eval(valueA));
        

        Selbst wenn hier keine Sicherheitslücken entstehen können, ist die Performance von eval() erbärmlich. Und du musst valueB und valueA ja auch noch auf die Pfeilfunktion abstimmen, in der Du das machst. Brrrr. Nicht machen!

        Die elegante Methode, um die Sortiereigenschaft dynamisch zu halten, geht so:

        let sortBy = "Si_max";
        
        leg.sort((a, b) => b[sortBy] - a[sortBy]);
        

        Der Name steht in einer Variablen, und zugegriffen wird mit der Indexmethode. Das ist immer noch zweitklassig, was die Geschwindigkeit angeht, aber für Arrays in haushaltsüblichen Größen völlig ok. Wenn es Dir zu langsam ist, dann erstelle ein Objekt, das vorgefertigte Sortierfunktionen enthält:

        const sorters = {
           Si_max: (a,b) => b.Si_max - a.Si_max,
           foo: (a,b) => b.foo - a.foo,
           bar: (a,b) => b.bar - a.bar
        };
        
        leg.sort(sorters[sortBy]);
        

        Aber dieses Vorgehen ist nur in Ausnahmefällen nötig. Oder dann, wenn die Sort-Algorithmen je Spalte sehr unterschiedlich sind:

        Für Eigenschaften, die Number- oder Date-Werte enthalten, klappt das mit der Subtraktion, aber wenn Du String-Spalten hast, geht das mit dem Minus nicht, damm musst Du einen anderen Sort-Callback verwenden. Empfehlenswert ist dafür die compare-Methode, die ein Intl.Collator bereitstellt. Im Wiki ist ein Beispiel dafür.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Jetzt funktioniert es. Vielen Dank :-)