mit zwei arrays folgende Tab aufbauen?
stefan_r
- javascript
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
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;
[latex]Mae govannen![/latex]
var 2007 = new Array ();
Cü,
Kai
[latex]Mae govannen![/latex]
var 2007 = new Array ();
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 ???
[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
[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
[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
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 | 7ges. | 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.
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
[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
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