mehrdimmensionales array per each durchlaufen - IE problem
Stil
- javascript
0 Struppi0 Jeena Paradies3 molily
Hallo,
ich stehe vor einen Problem mit dem IE und weiß nicht weiter.
Verwendet wird prototype.js
ich habe ein mehrdimensionales JS-array, dass vereinfacht wie folgt aussieht:
myarray = new Array();
myarray[108] = new Array();
myarray[108][1001] = new Array();
myarray[108][1001]['element'] = 'katze';
myarray[108][1001]['anzahl'] = 3;
myarray[108][1002] = new Array();
myarray[108][1002]['element'] = 'hunde';
myarray[108][1002]['anzahl'] = 2;
myarray[108][1003] = new Array();
myarray[108][1003]['element'] = 'fische';
myarray[108][1003]['anzahl'] = 3;
myarray[103] = new Array();
myarray[103][999] = new Array();
myarray[103][999]['element'] = 'amsel';
myarray[103][999]['anzahl'] = 7;
usw usw
nun durchlaufe ich das array :
alert(typeof myarray); /* funtioniert in FF und IE */
myarray.each(function(element, e_index) {
alert(typeof element); /* funtioniert in IE nicht*/
element.each(function(tier, t_index) {
alert(typeof tier);
});
});
während FF die Schleifen Problemlos durchläuft meldet IE hier schon beim 2. alert nicht mehr "object" sondern undefined.
Da also wohl kein array/object zurück geliefert wird kann auch die 2. Schleife nicht durchlaufen werden.
woran liegt das?
Wie kann ich das Problem beheben oder umgehen?
vielen Dank schon jetzt
Stil
nun durchlaufe ich das array :
normalerweise tut man das mit for(var i = 0; i < aray.length;i++)
myarray.each(function(element, e_index) {
alert(typeof element); /* funtioniert in IE nicht*/
Das funktioniert nirgendwo, wenn dann forEach, dort steht auch ein workaround für Browser die das nicht können.
Struppi.
Hallo,
normalerweise tut man das mit for(var i = 0; i < aray.length;i++)
Das bringt das Problem nur auf alle Browser.
myarray.each(function(element, e_index) {
alert(typeof element); /* funtioniert in IE nicht*/Das funktioniert nirgendwo
Das hier überlesen?
Verwendet wird prototype.js
Mathias
Das hier überlesen?
Verwendet wird prototype.js
Ja. Ich hatte mich schon gewundert warum each funktioniert.
Struppi.
Hallo,
myarray[108][1001] = new Array();
myarray[108][1001]['element'] = 'katze';
Ein Array kann als key keinen Text haben, ein Objekt aber schon. Wenn, dann würde ich dass am ehesten in der JSON Schreibweise machen:
var myarray = {
108: {
1001: {
"element": "katze";
}
}
};
Und dann mit
for(var i in myarray[108][1001]) {
alert(i + " ist " + myarray[108][1001][i]);
}
Oder gleich wie Struppi schrieb mit:
for(var i=0, count=myarray[108][1001].length; i<count; ++i {
alert(myarray[108][1001][i]);
}
Jeena
Hallo,
myarray = new Array();
myarray[108] = new Array();
Wenn du das notierst, enthält der Array 109 Elemente, von denen 108 automatisch auf undefined gesetzt werden!
während FF die Schleifen Problemlos durchläuft meldet IE hier schon beim 2. alert nicht mehr "object" sondern undefined.
Ja, weil das Element mit dem Index 0 den Wert undefined enthält.
Firefox macht das anders, weil im Firefox die browsereigene Methode forEach verwendet wird. Die testet, ob hinter der Nummer auch ein »definierter« Wert steckt. In anderen Browsern ruft Prototype einfach eine for-Schleife auf, die den Array von 0 bis myarray.length durchläuft. Also 109 mal.
woran liegt das?
Wie kann ich das Problem beheben oder umgehen?
Wenn du einen Array mit Lücken hast und die Lücken nirgendwo zwischenfunken sollen, dann arbeite mit Objects und for-in-Schleifen (siehe Jeena). Beachte aber, dass die sich dann nicht wie Arrays verhalten. Das Prototype-Pendant ist Hash, wobei du diese Datenstruktur besser in der JSON-Notation schreibst.
Mathias