Prototype: $A array each
Schorsch
- javascript
0 Christian Seiler0 Schorsch0 Cheatah0 Schorsch
1 Christian Seiler
Guten Tag
Ich definiere einen Array:
var arr = {ein:1,zwei:2,drei:3,vier:4};
Ich wandle diesen in ein Objekt um, damit
ich mit dem Framework "Prototype" arbeiten
kann:
arr = $A(arr);
Dann möchte ich den Array durchwandern:
arr.each(function(value, index){
alert("Index ist: "+index+" Wert: "+value);
});
Geht nicht!
Fehler: arr.inspect() sagt mir:
"[]"
Das heisst, mein arr ist leer!
Wer kapiert ein bisschen Javascript und kennt Prototype
und sieht, was ich flasch mache?
Freu mich auf Eure Hinweise
Schorsch
Hallo,
Ich definiere einen Array:
var arr = {ein:1,zwei:2,drei:3,vier:4};
Ich wandle diesen in ein Objekt um, damit
ich mit dem Framework "Prototype" arbeiten
kann:arr = $A(arr);
Das ist schonmal der Fehler. $A (argument) funktioniert nämlich nur in 2 Fällen:
argument besitzt eine Methode toArray, die ein Array zurückgibt. Dein Objekt besitzt keine derartige Methode.
argument besitzt eine Eigenschaft length und erlaubt den Zugriff über argument[i] (was nicht notwendigerweise ein Objekt des Typs Array sein muss). Dann wird ein neues Objekt vom Typ Array erzeugt und alles rüberkopiert.
$A(beliebiges_objekt) funktioniert dagegen nicht - es wird Dir immer eine leere Liste zurückgeben. Ich weiß nicht, ob prototype eine entsprechende Methode für beliebige Objekte anbietet, ansonsten bliebe noch so etwas wie (ungetestet):
zielArray = [];
for (var key in arr) {
/* oder irgendwas ähnliches, keine Ahnung, was genau in Deinem Ziel-
Array stehen soll */
zielArray.push (arr[key]);
}
Dann kannst Du mit zielArray anstellen, was Du willst.
Viele Grüße,
Christian
Salut
Das ist schonmal der Fehler. $A (argument) funktioniert nämlich nur in 2 Fällen:
argument besitzt eine Methode toArray, die ein Array zurückgibt. Dein Objekt besitzt keine derartige Methode.
argument besitzt eine Eigenschaft length und erlaubt den Zugriff über argument[i] (was nicht notwendigerweise ein Objekt des Typs Array sein muss). Dann wird ein neues Objekt vom Typ Array erzeugt und alles rüberkopiert.
Aha, vielen Dank für diese Infos.
Jetzt ist einiges klarer.
var arr = {ein:1,zwei:2,drei:3,vier:4}; // Objekt definieren
alert(arr['ein']); // Funktioniert
alert(arr.length); // Funktioniert nicht
Nicht ganz klar ist mir jedoch, warum arr.length nicht geht.
Ist das logisch?
Meine Frage:
Wie kann ich mein Objekt (ist es jetzt eigentlich ein Array oder nicht?) durch eine Schlaufe jagen,
so dass value und key ausgegeben werden?
Also:
var arr = {ein:1,zwei:2,drei:3,vier:4}
for each(objekte in arr)
{
alert(Schlüssel Wert);
}
Hat jemand eine Idee, wie ich das anstellen kann?
Gruss
Schorsch
Hi,
Nicht ganz klar ist mir jedoch, warum arr.length nicht geht.
Ist das logisch?
ja. Dein Irrtum liegt gleich in der ersten Zeile Deines Ursprungspostings:
| Ich definiere einen Array:
Du erstellst dort implizit ein new Object(), nicht mehr.
Wie kann ich mein Objekt (ist es jetzt eigentlich ein Array oder nicht?) durch eine Schlaufe jagen,
so dass value und key ausgegeben werden?
Schlaufe? :-)
Also:
var arr = {ein:1,zwei:2,drei:3,vier:4}
for each(objekte in arr)
{
alert(Schlüssel Wert);
}
"for" kennt (und braucht) kein "each", und "objekte" ist Dein Schlüssel. Wie man auf den Wert zugreift, weißt Du von diversen anderen Stellen in JavaScript, z.B. der elements-Collection.
Cheatah
Salut
"for" kennt (und braucht) kein "each", und "objekte" ist Dein Schlüssel. Wie man auf den Wert zugreift, weißt Du von diversen anderen Stellen in JavaScript, z.B. der elements-Collection.
Ah, ja, merci!
var arr = {ein:1,zwei:2,drei:3,vier:4};
for (var key in arr)
{
var value = arr[key];
alert("Schlüssel: "+key+" Wert: "+value);
}
Schorsch
Hallo Schorsch,
Aha, vielen Dank für diese Infos.
Jetzt ist einiges klarer.var arr = {ein:1,zwei:2,drei:3,vier:4}; // Objekt definieren
alert(arr['ein']); // Funktioniert
alert(arr.length); // Funktioniert nichtNicht ganz klar ist mir jedoch, warum arr.length nicht geht.
Ist das logisch?
Ja. Ich schreibe Deinen Code mal etwas um, so dass er noch exakt das gleiche macht, wie Deine erste Zeile:
var arr = new Object;
arr['ein'] = 1; arr['zwei'] = 2; arr['drei'] = 3; arr['vier'] = 4;
Object enthält per Default keinerlei Eigenschaften oder Methoden, d.h. Du weist ihm exakt vier Eigenschaften ein, zwei, drei und vier zu.
Wenn Du einen Array anlegen willst, musst Du sowas wie
var arr1 = [ 1, 2, 3, 4 ];
var arr2 = [];
machen. Allerdings nützt es Dir nichts, wenn Du dem Array dann weitere Eigenschaften zuweist, denn die sind _unabhängig_ von der length-Eigenschaft des Arrays, d.h.
var arr = [];
arr['ein'] = 1;
alert (arr.length);
spuckt Dir 0 aus, da Du eine Eigenschaft des Objekts (ein Array ist immer auch ein Objekt in JavaScript) gesetzt hast, den Speichermechanismus "Array" jedoch nicht genutzt hast. Wenn Du nämlich z.B. folgendes machst:
var arr = [];
arr[4] = 'foo';
alert (arr.length);
Dann spuckt Dir der Code 5 aus, denn Du hast das 5. Element des Arrays (Zählung geht bei 0 los) gesetzt; alle anderen Elemente davor, die zuvor nicht gesetzt waren, werden mit undefined aufgefüllt, d.h. ein
var arr = [];
arr[10000000] = 'foo';
braucht *sehr* viel Speicher, obwohl Du nur ein Element hinzufügst. Wenn Du dagegen
var arr = {};
arr[10000000] = 'foo';
machst, dann wird nur der Speicher für *eine* neue Eigenschaft mit dem Namen 10000000 benutzt, *allerdings* wird gibt's dann auch kein arr.length weil arr dann nur ein Objekt und *kein* Array ist - d.h. Du kannst auch nicht die typischen Array-Methoden auf arr anwenden.
Wie kann ich mein Objekt (ist es jetzt eigentlich ein Array oder nicht?)
durch eine Schlaufe jagen, so dass value und key ausgegeben werden?
Schau Dir mal das zweite Beispiel unter http://de.selfhtml.org/javascript/sprache/schleifen.htm#for an.
Viele Grüße,
Christian