for-in und assoziatives Array
Michael H.
- javascript
0 Struppi-1 Cybaer0 lina-0 peterS.
Hallo Leute,
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array und bevölkere es u.a. mittels push() (keine Ahnung ob das wichtig ist aber präventiv schreib ich das mal). Noch ein Hinweis: Die Keys die ich benutze sind zwar numerisch, der erste ist aber eine 2 und keine 0...
Nun möchte ich es in einer Schleife durchgehen und da die keys nicht fortlaufend numerisch sind mache ich das mit for (var x in y)
nun bekomme ich leider nicht nur die numerischen keys raus, sondern auch eine Liste mit array eigenschaften: each,all,any,collect,detect,findAll,grep,include,inject,invoke,... (32 Stück, im IE ist die Reihenfolge anders, sonst sind es die gleichen).
In keiner Doku zu dem Thema hab ich das bisher gesehen, mach ich da irgendwas falsch oder muss ich diese eigenschaften irgendwie filtern? wie soll ich das machen, auch die numerischen keys kommen als typeof "string"....
Danke für eure Hilfe
Michael
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array und bevölkere es u.a. mittels push() (keine Ahnung ob das wichtig ist aber präventiv schreib ich das mal). Noch ein Hinweis: Die Keys die ich benutze sind zwar numerisch, der erste ist aber eine 2 und keine 0...
Assoziative Arrays in JS sind keine Arrays!
Letztlich gibt es auch keine, sondern du nutzt die Eigenschaft von JS, Objekten beliebige Attribute hinzufügen zu könne.
D.h. du musst das Array als Objekt deklarieren und wmittels dem Index Operator neue Eigenschaften hinzufügen.
In keiner Doku zu dem Thema hab ich das bisher gesehen, mach ich da irgendwas falsch oder muss ich diese eigenschaften irgendwie filtern? wie soll ich das machen, auch die numerischen keys kommen als typeof "string"....
In selfhtml wird das mittlerweile so beschrieben.
Struppi.
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array und bevölkere es u.a. mittels push() (keine Ahnung ob das wichtig ist aber präventiv schreib ich das mal). Noch ein Hinweis: Die Keys die ich benutze sind zwar numerisch, der erste ist aber eine 2 und keine 0...
Assoziative Arrays in JS sind keine Arrays!
Letztlich gibt es auch keine, sondern du nutzt die Eigenschaft von JS, Objekten beliebige Attribute hinzufügen zu könne.
Ok, ich komme aus der PHP-Welt und dort ist alles assoziativ, auch die mit numerischen Keys. Mir geht es eigentlich darum: In meinem Array (wirklich ein Array) benutze ich nur numerische keys, aber eben nicht (wie bei einem "normalen" Array) durchnummeriert von 0 bis x. Deshalb brauch ich die for-in Schleife, weil ich nicht weiß welcher der Indizes da sind und welche nicht.
Aber ich bekomme eben diese komischen anderen Keys auch noch raus und weiß nicht warum....
Michael
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array und bevölkere es u.a. mittels push() (keine Ahnung ob das wichtig ist aber präventiv schreib ich das mal). Noch ein Hinweis: Die Keys die ich benutze sind zwar numerisch, der erste ist aber eine 2 und keine 0...
Assoziative Arrays in JS sind keine Arrays!
Letztlich gibt es auch keine, sondern du nutzt die Eigenschaft von JS, Objekten beliebige Attribute hinzufügen zu könne.Ok, ich komme aus der PHP-Welt und dort ist alles assoziativ, auch die mit numerischen Keys. Mir geht es eigentlich darum: In meinem Array (wirklich ein Array) benutze ich nur numerische keys, aber eben nicht (wie bei einem "normalen" Array) durchnummeriert von 0 bis x. Deshalb brauch ich die for-in Schleife, weil ich nicht weiß welcher der Indizes da sind und welche nicht.
Aber ich bekomme eben diese komischen anderen Keys auch noch raus und weiß nicht warum....
weil du mit for in alle Eigenschaften eines Objektes abfragst. Wie gesagt da es keine AA gibt ist diese Fnktion auch nicht dafür gedacht eines nachzubilden, sie kann allerdings dafür benutz werden, wenn du ein allgemeines Objekt hast.
Für dein Problem ist nur eine normale Schleife über alle Einträge möglich zumal JS fehlende Einträge ja ergänzt (mit undefined).
siehst du hier:
var a = new Array();
a[0] = '1';
a[100] = '100';
alert(a.length);
Struppi.
haha! Ich weiß woran das liegt. An der PROTOTYPE-Klasse, die bei scriptaculous benötigt wird. Die bauen in ein Array mehr Eigenschaften ein als es hat und das bricht die for/in-Schleife. Ohne prototype würde es gehen...
aber ich werde wohl die Methode von Struppi nehmen (normale for und alle undefined filtern). Hoffen wir, daß das geht....
Vielen Dank für die zahlreichen Vorschläge, auch das Thema IE für MAC (daran hatte ich nicht gedacht).
Michael H.
Hi,
Ok, ich komme aus der PHP-Welt und dort ist alles assoziativ, auch die mit numerischen Keys.
PHP macht keinen Unterschied zw. indizierten und assoziativen Arrays, ja. Aber für PHP ist ja auch ein String ein Array.
PHP ist halt eine Schlampensprache.
Und wie das mit Schlampen nunmal so ist: Herrlich versaut, geil im Bett, aber man renomiert damit nicht vor seinen Eltern. :->
Gruß, Cybaer
Hi,
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array
In JS? JS kennt keine assoziativen Arrays. Aber Du kannst natürlich nach Beleben Objekte erstellen, die für dich so aussehen, as wären es assoz. Arrays.
Und ...
und bevölkere es u.a. mittels push()
... push() hätte bei aAs ohnehin nichts verloren.
(keine Ahnung ob das wichtig ist aber präventiv schreib ich das mal). Noch ein Hinweis: Die Keys die ich benutze sind zwar numerisch,
Das wage ich zu bezweifeln. Ein String wird selbst dann nicht zu einer Zahl, wenn er nur Ziffern enthält. Ggf. konvertieren Programmiersprache aber Typen automatisch - wohl kaum aber bei aAs - zumal wenn die Programmiersprache aAs gar nicht kennt. ;-)
Nun möchte ich es in einer Schleife durchgehen und da die keys nicht fortlaufend numerisch sind
Ist das "mixed Array" (Mischung aus normalem und assoz.Array) eine Erfindung von dir?
mach ich da irgendwas falsch
Anscheinend alles.
wie soll ich das machen, auch die numerischen keys kommen als typeof "string"....
Kein Wunder.
Aber Du könntest feststellen, ob ein String aus einer Zahl besteht. Sinnvoller erscheint mir aber, einen neuen Ansatz zu überlegen.
Gruß, Cybaer
moin Michael :)
Nur am Rande:
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array und bevölkere es u.a. mittels push() (keine Ahnung ob das wichtig ist aber präventiv schreib ich das mal).
Wichtig ist es nur, wenn du auf "IE5 für Mac"-User rücksicht nehmen willst. Die können deine Seite nämlich nicht so nutzen wie du es gern hättest, da der IE5 für Mac uasgewählte Array-Operationen (darunter push()) nicht unterstützt.
liebe Grüße aus Berlin
lina-
gruss Michael
Hallo Leute,
Ich bin grade am Verzweifeln! Ich erstelle ein assoziatives Array ...
<mantra>JavaScript kennt keine assoziativen_arrays</mantra>
Du bohrst gerade ein Array-object auf. das ist nicht verboten -
immerhin benutzt Du numerische indizes zur adressierung Deiner
daten.
und bevölkere es u.a. mittels push() (keine Ahnung ob das wichtig ist
aber präventiv schreib ich das mal). Noch ein Hinweis: Die Keys die ich
benutze sind zwar numerisch, der erste ist aber eine 2 und keine 0...
das macht nichts, dann sind arr[0] und arr[1] eben [undefined].
Nun möchte ich es in einer Schleife durchgehen und da die keys nicht
fortlaufend numerisch sind mache ich das mit for (var x in y)
nimm den klassischen weg ueber "for (var i=0; i<arr.length; ++i) {...}".
fuer indizes, die Du nicht belegt hast, bekommst Du dann einfach ein
[undefined] zurueckgeliefert. der typeof-operator hilft Dir, diese werte
herauszufiltern.
nun bekomme ich leider nicht nur die numerischen keys raus, sondern
auch eine Liste mit array eigenschaften: each,all,any,collect,detect,
findAll,grep,include,inject,invoke,... (32 Stück, im IE ist die
Reihenfolge anders, sonst sind es die gleichen).
dann benutzt Du offensichtlich eine js-bibliothek, die Dein objekt um
die oben genannten array-eigenschaften erweitert. ein unschuldiges
sprachkern-array rückt auch bei "for in" wirklich nur seine indizes
heraus (es wird Dir nochnichteinmal "length" offenbaren).
...
wie soll ich das machen, auch die numerischen keys kommen als typeof
"string"...
das ist nur konsequent - "for ... in" holt _keys_ aus jedem object.
~~~javascript
var arr = ["entry 0", "entry 1", "entry 2", "entry 3", "entry 4"];
var prop, log = "";
for (prop in arr) {
log += prop + ":" + (typeof prop) + " = " + arr[prop] + ":" + (typeof arr[prop]) + "\n";
}
if (arr.toSource) {
alert("arr.toSource():\n\n" + arr.toSource());
}
alert("log:\n\n" + log);
//var arr = ["entry 0", "entry 1", "entry 2", "entry 3", "entry 4"];var prop, log = "";for (prop in arr) {log += prop + ":" + (typeof prop) + " = " + arr[prop] + ":" + (typeof arr[prop]) + "\n";}if (arr.toSource) {alert("arr.toSource():\n\n" + arr.toSource());}alert("log:\n\n" + log);
by(t)e by(t)e - peterS. - pseliger@gmx.net
--
"Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive." - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]