Assoziatives Array in Opera
Hawklan
- javascript
Hallo!
Ich habe soeben ein extrem seltsames Phänomen mit assoziativen Arrays unter Opera (Version 7.11) festgestellt.
Ich Deklariere den Array wie folgt:
var menuItems = new Array();
menuItems['item1'] = new menuItem(1,1,0,'test1','#','_top',1);
menuItems['item2'] = new menuItem(2,1,0,'test2','#','_top',1);
menuItems['item3'] = new menuItem(3,1,2,'test3','#','_top',1);
menuItems['item4'] = new menuItem(4,1,0,'test4','#','_top',1);
menuItems['item5'] = new menuItem(5,1,0,'test5','#','_top',1);
menuItems['item6'] = new menuItem(6,2,0,'test6','#','_top',1);
menuItems['item7'] = new menuItem(7,2,0,'test7','#','_top',1);
menuItems['item8'] = new menuItem(8,2,0,'test8','#','_top',1);
menuItems['item9'] = new menuItem(9,2,3,'test9','#','_top',1);
menuItems['item10'] = new menuItem(10,2,0,'test10','#','_top',1);
menuItems['item11'] = new menuItem(11,3,0,'test11','#','_top',1);
menuItems['item12'] = new menuItem(12,3,0,'test12','#','_top',1);
Anmerkung: "menuItem" ist ein selbstdefiniertes Objekt und meiner Meinung nach für mein problem unerheblich.
Weiter unten im Script habe ich eine Testfunktion geschrieben, die diesen assoziativen Array verarbeite:
function showItemTree(){
var treeOut = "";
for(var mi in menuItems){
treeOut = treeOut + "->" + mi;
}
alert(treeOut);
}
Rufe ich nun showItemTree() auf, erhalte ich in allen anderen Browsern das korrekte Ergebniss, nämlich den String:
"->item1->item2->item3->item4->item5->item6->item7->item8->item9->item10->item11->item12"
Aber unter Opera erhalte ich:
"->item1->item2->item3->item4->item9->item10->item11->item12->item5->item6->item7->item8"
?!?
Hat da jemand eine Erklärung dafür ?
Ich habe mir zwar schon was ausgedacht, wie ich das Problem umgehen kann, aber das ist doch recht aufwendig und daher würde mich mal interessieren, ob da jemandem was zu einfaällt und vor allem, wieso Opera sich da so seltsam verhält.
Grüße,
Thomas
Moin!
Rufe ich nun showItemTree() auf, erhalte ich in allen anderen Browsern das korrekte Ergebniss, nämlich den String:
"->item1->item2->item3->item4->item5->item6->item7->item8->item9->item10->item11->item12"
Aber unter Opera erhalte ich:
"->item1->item2->item3->item4->item9->item10->item11->item12->item5->item6->item7->item8"
Genauso, wie in Perl die Reihenfolge eines assoziativen Arrays nicht garantiert werden kann, wenn man die Schlüssel nicht sortiert, so kann offenbar auch in Javascript die Reihenfolge nicht garantiert werden und entspricht offenbar nicht der erwarteten bzw. definierten Reihenfolge beim Erstellen des Arrays.
Ergo: Beide Ergebnisse sind korrekt - aber eines davon ist für dich unerwartet.
- Sven Rautenberg
Jo sowas hatte ich mir durchaus schon gedacht ... hängt vermutlich damit zusammen, wie die browser den Speicher allocieren.
Tja dann werde ich wohl nicht drumherum kommen mir ne Schlüsselsortierungsfunktion zu basteln.
Mich hatte lediglich gewundert, daß es in allen Browsern geht ausser im Opera...und selbst bei dem hatte ich mit einer vorgängerversion meines scriptes bisher nie probleme.
Sachen gibts... :)