Michael H.: for-in und assoziatives Array

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

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

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

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

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

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

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. 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

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  3. 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-

    --
    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
  4. 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:]