stefan_r: mit zwei arrays folgende Tab aufbauen?

Hallo zusammen,

ich habe zwei Array die ich gerne folgendermaßen auflisten möchte, weiß aber nicht wie ich es hinbekommen soll.

array1 (Prod1, 2, Prod1, 3, Prod2, 4, Prod2, 5) //Daten von diesem Jahr
array2 (Prod1, 3, Prod1, 1, Prod2, 3, Prod2, 4) //Daten vom letzten Jahr

nun will ich aus diesen beiden arrays folgende tabelle erstellen.

Produkt | 2008 | 2007
-----------------------
Prod1   |  5   |  4
Prod2   |  9   |  7
-----------------------
ges.    |  14  |  11

kann mir einer einen Tipp geben, wie ich die Tabelle so Zeilenweise aufbauen kann.

Über jeden kleinen Tipp würde ich mich freuen
Viele Grüße
Stefan

  1. Habe nun die beiden Arrays zuvor in zwei mehrdimensionales Array geschrieben.

    //2007
    array1[0][0] = Prod1
    array1[0][1] = 2
    array1[1][0] = Prod1
    array1[1][1] = 3
    array1[2][0] = Prod2
    array1[2][1] = 4
    array1[3][0] = Prod2
    array1[3][1] = 5

    //2007
    array2[0][0] = Prod1
    array2[0][1] = 3
    array2[1][0] = Prod1
    array2[1][1] = 1
    array2[2][0] = Prod2
    array2[2][1] = 3
    array2[3][0] = Prod2
    array2[3][1] = 4

    wenn ich es z.B. diese beiden Arrays folgendermaßen durgehen kann, könnte man doch daraus folgende Arrays erstellen oder?

    Nur wie kann ich dies so hinbekommen?

    var 2007 = new Array ();
    2007 [Prod1] = new Array ();
    2007 [Prod1] [0] = 2;
    2007 [Prod1] [1] = 3;
    2007 [Prod2] = new Array ();
    2007 [Prod2] [0] = 4;
    2007 [Prod2] [1] = 5;

    var 2008 = new Array ();
    2008 [Prod1] = new Array ();
    2008 [Prod1] [0] = 3;
    2008 [Prod1] [1] = 1;
    2008 [Prod2] = new Array ();
    2008 [Prod2] [0] = 3;
    2008 [Prod2] [1] = 4;

    1. [latex]Mae  govannen![/latex]

      var 2007 = new Array ();

      das darfst du nicht

      Cü,

      Kai

      --
      Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
      Sacrifice - the future has it's price
      And today is only yesterday's tomorrow
      selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
      1. [latex]Mae  govannen![/latex]

        var 2007 = new Array ();

        das darfst du nicht

        Cü,

        Kai

        korrekt, war nur ein beispiel müsste natürlich
        array_2007 schreiben.

        Ich bin bereits am basteln.

        Stand der dinge:

        function array_sort(prodzeile) {

        var sum_values = new Array();

        for (var z=0; z <= prodzeile.length; z++) {
               if (prodzeile[z][0] == prodzeile[z+1][0]) {
                sum_values[prodzeile[z][0]] = new Object();

        for (var t=0; t <= prodzeile.length; t++) {
                  sum_values[prodzeile[z][0]][t] = [prodzeile[z][t]];
                  }
              }
             }
            }

        funktioniert aber noch nicht.
        Der Vergleich der Produktnamen scheitert nach ablaufen des Arrays (undefined) an diesem Punkt prodzeile[z+1][0].
        Korrekt. Ist das Array 5 groß ist 6 undefined. Wie bekomme ich das hin ???

        1. [latex]Mae  govannen![/latex]

          for (var z=0; z <= prodzeile.length; z++) {

          funktioniert aber noch nicht.
          Der Vergleich der Produktnamen scheitert nach ablaufen des Arrays (undefined) an diesem Punkt prodzeile[z+1][0].
          Korrekt. Ist das Array 5 groß ist 6 undefined. Wie bekomme ich das hin ???

          Klar, wenn du <= als Vergleichsoperator verwendest, erfolgt ein Schleifendurchlauf mehr als du willst.

          Also nur den Vegleichsoperator < benutzen.

          for (var z=0, len=prodzeile.length; z < len; z++) {

          Außerdem finde ich generell mehrstufig verschachtelte Arrays als Datenspeicher-Format ziemlich unpraktisch, wenn du es frei ändern kannst, würde ich zur Objektliteralschreibweise raten (und immer darauf achten, daß hinter dem letzten Eintrag kein Komma gesetzt wird.

          var Daten = {  
            jahr2008: {  
              bla: 23,  
              fasel: 44,  
              blubb: 2  
            },  
            jahr2007: {  
              bla: 22,  
              falsel: 30,  
              blubb: 3  
            }  
          }
          

          Du kannst dann alle Einträge mit for..in.. -Schleifen abarbeiten.

          Direktzugriff:

          alert(Daten.jahr2008.bla); // 23  
          
          
          for (a in Daten) {  
           alert(Daten[a].fasel); // 44, 30  
          }
          

          Cü,

          Kai

          --
          Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
          Sacrifice - the future has it's price
          And today is only yesterday's tomorrow
          selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
          1. [latex]Mae  govannen![/latex]

            var Daten = {

            jahr2008: {
                bla: 23,
                fasel: 44,
                blubb: 2
              },
              jahr2007: {
                bla: 22,
                falsel: 30,
                blubb: 3
              }
            }

            
            >   
            > Du kannst dann alle Einträge mit for..in.. -Schleifen abarbeiten.  
            >   
            > Direktzugriff:  
            > ~~~javascript
            
            alert(Daten.jahr2008.bla); // 23  
            
            > 
            
            

            for (a in Daten) {

            alert(Daten[a].fasel); // 44, 30
            }

            
            >   
            >   
            > Cü,  
            >   
            > Kai  
              
            Hallo Kai,  
              
            erst einmal vielen dank für Deine Hilfe.  
              
            ich hohle alle Werte aus einer DB und muss sie nach datum (per schleife) in Arrays eintragen. Wird also glaube ich Probleme geben so wie Du mir es vorstellst.  
              
            Habe es nun per Array weiterprobiert korrekt habe übersehen <= falsch natürlich <  
              
            nun bleibe ich am Produktvergleich hängen.  
              
            if (prodzeile[z][0] == prodzeile[z+1][0]) {  
            ...  
              
            er sagt mir nun Null oder kein objekt.  
              
            Was kann ich hier nun machen???  
              
            Gruß  
            Stefan
            
            1. [latex]Mae  govannen![/latex]

              ich hohle alle Werte aus einer DB und muss sie nach datum (per schleife) in Arrays eintragen. Wird also glaube ich Probleme geben so wie Du mir es vorstellst.

              Man könnte das durchaus auch "dynamisch" so aufbauen, wie ich vorschlug, aber wenn du mit Arrays besser zurechtkommst, geht es natürlich auch so. War ja nur ein Vorschlag, ohne Hammer.

              nun bleibe ich am Produktvergleich hängen.

              if (prodzeile[z][0] == prodzeile[z+1][0]) {

              Keine Ahnung, welche Werte in den einzelnen Arrayfeldern abgelegt wurden.
              lasse dir die benutzen Werte per alert() anzeigen.

              z.B. alert(prodzeile[z][0]+'\n'+prodzeile[z+1][0])

              Cü,

              Kai

              --
              Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
              Sacrifice - the future has it's price
              And today is only yesterday's tomorrow
              selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
  2. array1 (Prod1, 2, Prod1, 3, Prod2, 4, Prod2, 5) //Daten von diesem Jahr
    array2 (Prod1, 3, Prod1, 1, Prod2, 3, Prod2, 4) //Daten vom letzten Jahr

    Ich würd die Daten anders aufbauen.

    nun will ich aus diesen beiden arrays folgende tabelle erstellen.

    Produkt | 2008 | 2007

    Prod1   |  5   |  4
    Prod2   |  9   |  7

    ges.    |  14  |  11

    So in etwa:

      
    // Hilfsfunktion, für die Ausgabe  
    String.prototype.fix = function(width, c , align)  
    {  
       if(!width) return null;  
       if(!c) c = " ";  
       if(!align) align = LEFT;  
      
       var tmp = "";  
       var j = 0;  
      
       var start = 0;  
       if (align == RIGHT) start = width - this.length;  
       else if(align == CENTER) start = width/2 - (this.length/2);  
      
       if (start < 0 ) start = 0;  
       start = parseInt(start);  
       for(var i = 0; i < width;i++)  
       {  
           if(i == start)  
           {  
               if(j < this.length)  
               {  
                 tmp += this.charAt(j++);  
                 start++;  
                 continue;  
               }  
           }  
           tmp += c;  
       }  
       return tmp;  
    }  
    window.CENTER = 1;  
    window.LEFT = 2;  
    window.RIGHT = 3;  
      
    var werte = {  
    2007: [  
    { Prod1: 3},  
    { Prod1: 1},  
    { Prod2: 3},  
    { Prod2: 4}  
    ], // Array 2007  
    2008: [  
    { Prod1: 2},  
    { Prod1: 3},  
    { Prod2: 4},  
    { Prod2: 5}  
    ]  
    };  
    document.write('<pre>' +formatWerte(werte) + '</pre>');  
      
    function formatWerte(wert) {  
     var text = 'Übersicht'.fix(10, ' ', CENTER);  
     var produkte = {};  
     var summe = {};  
      
     // Titelzeile:  
     for(var jahr in wert) {  
      text += '|' + jahr.fix(6, ' ', CENTER);  
      var array = wert[jahr];  
      //produkte[jahr] = {};  
      for(var i = 0; i < array.length; i++) {  
       for(p in array[i]) {  
        if(!produkte[p]) produkte[p] = {};  
        if(!produkte[p][jahr]) produkte[p][jahr] =0;  
        if(!summe[jahr]) summe[jahr] = 0;  
      
        produkte[p][jahr] += array[i][p];  
        summe[jahr] += array[i][p];  
       }  
      }  
     }  
     text += '\n';  
      
     // inhalt  
     for(var p in produkte) {  
      text += p.fix(10, ' ', CENTER);  
      
      for(jahr in produkte[p]) {  
       text += '|' + (''+ produkte[p][jahr]).fix(6, ' ', CENTER);  
      }  
      text += '\n';  
     }  
      
     // Summe  
     text += ''.fix(40, '-') + '\n'  
     + ''.fix(10, ' ');  
      
     for(jahr in produkte[p]) {  
       text += '|' + (''+ summe[jahr]).fix(6, ' ', CENTER);  
      }  
     return text;  
    }  
    
    

    Struppi.

    1. var werte = {
      2007: [
      { Prod1: 3},
      { Prod1: 1},
      { Prod2: 3},
      { Prod2: 4}
      ], // Array 2007
      2008: [
      { Prod1: 2},
      { Prod1: 3},
      { Prod2: 4},
      { Prod2: 5}
      ]
      };

      Mensch @Struppi super,

      vielen Herzlichen Dank, das schaut doch super aus. Nur noch eine Frage.

      Ich hohle die werte folgendermaßne aus einer DB:
      ...
       while(rc == 0) {

      LibPrd  = ocxBase.GetRubVal(RubLibPrd, 0);
          Qty  = ocxBase.GetRubVal(RubQty, 0);
          Ch_Date  = ocxBase.GetRubVal(RubDate, 0);

      if (Ch_Date >= first_day) {
             prodzeile[j] = new Array();
            prodzeile[j][0] = LibPrd;
            prodzeile[j][1] = Qty;
            j++;
          } else if (Ch_Date >= last_year && Ch_Date < first_day){
             prodzeile[j] = new Array();
            prodzeile[j][0] = LibPrd;
            prodzeile[j][1] = Qty;
            j++;
          } else if (Ch_Date >= sec_year && Ch_Date < last_year) {
             prodzeile[j] = new Array();
            prodzeile[j][0] = LibPrd;
            prodzeile[j][1] = Qty;
            j++;
          }
      }

      ...

      wie bekomme ich die in Deinen Vorschlag?

      Gruß
      Stefan

      1. [latex]Mae  govannen![/latex]

        while(rc == 0) {

        LibPrd  = ocxBase.GetRubVal(RubLibPrd, 0);
            Qty  = ocxBase.GetRubVal(RubQty, 0);
            Ch_Date  = ocxBase.GetRubVal(RubDate, 0);

        if (Ch_Date >= first_day) {
               prodzeile[j] = new Array();
              prodzeile[j][0] = LibPrd;
              prodzeile[j][1] = Qty;
              j++;
            } else if (Ch_Date >= last_year && Ch_Date < first_day){
               prodzeile[j] = new Array();
              prodzeile[j][0] = LibPrd;
              prodzeile[j][1] = Qty;
              j++;
            } else if (Ch_Date >= sec_year && Ch_Date < last_year) {
               prodzeile[j] = new Array();
              prodzeile[j][0] = LibPrd;
              prodzeile[j][1] = Qty;
              j++;
            }
        }

        Irgendwie sehe ich jetzt gerade keinen Unterschied innerhalb der einzelnen Zweige der if-Verzweigung, hast du da noch etwas ausgelasssen?

        Ausserdem kannst du

        prodzeile[j] = new Array();  
        prodzeile[j][0] = LibPrd;  
        prodzeile[j][1] = Qty;
        

        auch in einer Zeile schreiben:
        prodzeile[j] = [LibPrd, Qty];
        Cü,

        Kai

        --
        Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
        Sacrifice - the future has it's price
        And today is only yesterday's tomorrow
        selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
        1. Ausserdem kannst du

          prodzeile[j] = new Array();

          prodzeile[j][0] = LibPrd;
          prodzeile[j][1] = Qty;

          
          >   
          > auch in einer Zeile schreiben:  
          > `prodzeile[j] = [LibPrd, Qty];`{:.language-javascript}  
          > Cü,  
          >   
          > Kai  
            
          und wie bekäme ich diese Werte dynamisch in dieser schleife in ?  
            
          var werte = {  
          2007: [  
          { Prod1: 3},  
          { Prod1: 1},  
          { Prod2: 3},  
          { Prod2: 4}  
          ], // Array 2007  
          2008: [  
          { Prod1: 2},  
          { Prod1: 3},  
          { Prod2: 4},  
          { Prod2: 5}  
          ]  
          };  
            
          Habt Ihr noch einen Tipp bin nicht so 100% fit wie Ihr