Melanie: Array schwierig zu sortieren

Hallo,

ich habe ein Problem mit Arrays:
Ich habe Datensätze (jeweils ein eigenes array für jeden), ungefähr so:
var datensatz_1 =new Array ("Name", "Produkt", "Betrag");

davon habe ich mindestens 10. Mit diesen Datensätzen wird nun gerechnet und gerechnet, passt auch alles.

Nun sollten diese Datensätze in einer Tabelle ausgegeben werden. Auch kein Probem.

Problematisch wird es jetzt: die Datensätze sollen nach dem Betrag (datensatz_1[2]) sortiert werden und dann in der Tabelle ausgegeben werden. Das ausgeben ist kein Problem, aber das sortieren.

Ich habe folgendes probiert: den Betrag aus jedem Datensatz genommen und alle Beträge in ein extra Array gespeichert. Funktioniert. Numerisch aufsteigend sortiert. Funktioniert auch. Allerdings verliere ich dabei die Referenz auf den ursprünglichen Datensatz, nicht wahr? Den brauche ich aber für die Ausgabe... *argh*

Wie kann ich das Problem lösen, jemand ne Idee? Muss ich vielleicht mit mehrdimensionalen Arrays arbeiten?

Oder gibt es eine Funktion, die sich die Position des Wertes vor der Sortierung merkt? Das wäre wohl am besten! Aber wie geht das?

Danke für Eure Hilfe!
Melanie

  1. Tag Melanie.

    Ich habe Datensätze (jeweils ein eigenes array für jeden), ungefähr so:
    var datensatz_1 =new Array ("Name", "Produkt", "Betrag");
    davon habe ich mindestens 10. Mit diesen Datensätzen wird nun gerechnet und gerechnet, passt auch alles. [...]
    Problematisch wird es jetzt: die Datensätze sollen nach dem Betrag (datensatz_1[2]) sortiert werden und dann in der Tabelle ausgegeben werden. Das ausgeben ist kein Problem, aber das sortieren.

    Wieso, sort() funktioniert auch bei mehrdimensionalen Arrays. Beispiel:

    var saetze = new Array();
    saetze[0] = new Array("1", "Werner");
    saetze[1] = new Array("5", "Willi");
    saetze[2] = new Array("3", "Wenzel");
    saetze[3] = new Array("4", "Waldemar");
    saetze[4] = new Array("2", "Wladislaw");

    saetze.sort();

    var Namenausgabe = saetze.join(",");
    document.write("sortierte Namen: " + Namenausgabe + "<br>");

    Ergibt folgende Ausgabe:
    »sortierte Namen: 1,Werner,2,Wladislaw,3,Wenzel,4,Waldemar,5,Willi«

    [dsf 3.6]
    Siechfred

    --
    »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
    1. Hi,

      Wieso, sort() funktioniert auch bei mehrdimensionalen Arrays. Beispiel:

      Reicht ihr(?) nicht. Zumindest nicht ohne die einzelnen Datensätze umzustellen. Das ist unelegant.

      var Namenausgabe = saetze.join(",");
      document.write("sortierte Namen: " + Namenausgabe + "<br>");

      Ergibt folgende Ausgabe:
      »sortierte Namen: 1,Werner,2,Wladislaw,3,Wenzel,4,Waldemar,5,Willi«

      das funtkioniter deshalb, weil Array auch nichts anderes als Strings sind. Intern werden Deine Dinger wie folgt gespeichert "1Werner2Wladislaw3Wenzel4Waldemar5Willi", das einzelne Unterarray also z.B. "1Werner", die Sortierung erfolgt dabei also auf den gesamten Strings "1Werner", "2Wladislaw" usw. Zudem wird hier auch der Betrag lexikalisch sortiert, das dürfte nicht erwünscht sein.

      so short

      Christoph Zurnieden

      1. Tag Christoph.

        das funtkioniter deshalb, weil Array auch nichts anderes als Strings sind.

        Nein, das funktioniert auch, wenn die Zahlen ohne Hochkommata geschrieben sind, allerdings dürfte hier die automatische Typumwandlung zur Anwendung kommen.

        Intern werden Deine Dinger wie folgt gespeichert Werner2Wladislaw3Wenzel4Waldemar5Willi", das einzelne Unterarray also z.B. "1Werner", die Sortierung erfolgt dabei also auf den gesamten Strings "1Werner", "2Wladislaw" usw. Zudem wird hier auch der Betrag lexikalisch sortiert, das dürfte nicht erwünscht sein.

        Ja, das Beispiel ist natürlich an die Bedürfnisse der OP anzupassen, demonstriert aber, dass sort ein gangbarer Weg sein kann.

        Siechfred

        --
        »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
  2. Hi,

    ich habe ein Problem mit Arrays:
    Ich habe Datensätze (jeweils ein eigenes array für jeden), ungefähr so:
    var datensatz_1 =new Array ("Name", "Produkt", "Betrag");

    davon habe ich mindestens 10. Mit diesen Datensätzen wird nun gerechnet und gerechnet, passt auch alles.

    Soviele Datensätze und die fliegen einfach so lose rum?
    Näh, die sollten erstmal in eine Schachtel, also in ein Array.

    Wie kann ich das Problem lösen, jemand ne Idee? Muss ich vielleicht mit mehrdimensionalen Arrays arbeiten?

    Ja, ist das einfachste.

    Oder gibt es eine Funktion, die sich die Position des Wertes vor der Sortierung merkt?

    Man könnte sich sowas basteln (mit einem assoziativem Array oder noch komplizierter), aber ...

    Das wäre wohl am besten!

    ... noch mehr verknotet ginge dann kaum noch.

    Aber wie geht das?

    Du kannst sort() eine eigene Vergleichsfunktion angeben.

    Ich klau da mal das Beispiel aus Selfhtml:

    function Numsort(a,b)
    { return a-b; }

    var Zahlen = new Array(27,2,10,4);
    Zahlen.sort();
    var Zahlenlex = Zahlen.join(",");
    document.write("sortierte Zahlen lexikalisch: " + Zahlenlex + "<br>");
    var Zahlen2 = new Array(27,2,10,4);
    Zahlen2.sort(Numsort);
    var Zahlennum = Zahlen2.join(",");
    document.write("sortierte Zahlen numerisch: " + Zahlennum);

    Du wirst feststellen, das sich die Ausgaben unterscheiden (falls ich mich nicht vertan habe, nix getestet).

    Die Syntax, um in verschachtelten (ja gut: mehrdimensionalen) Arrays ist die gleiche, wie in C.
    array[2][3] für das vierte Element im drittem Element (ein Array) im Array array.

    so short

    Christoph Zurnieden

  3. Hallo Melanie,

    am besten legst Du die Datensätze in ein 2D-Array. Wie Du das sortierst, siehst Du (unter anderem) hier.

    Gruß, Jürgen