Schorsch: Prototype: $A array each

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

  1. 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:

    1. argument besitzt eine Methode toArray, die ein Array zurückgibt. Dein Objekt besitzt keine derartige Methode.

    2. 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

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. Salut

      Das ist schonmal der Fehler. $A (argument) funktioniert nämlich nur in 2 Fällen:

      1. argument besitzt eine Methode toArray, die ein Array zurückgibt. Dein Objekt besitzt keine derartige Methode.

      2. 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

      1. 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

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. 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

      2. 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 nicht

        Nicht 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

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup