Jeena Paradies: PHPs array_flip() in JS nachbauen

Hallo,

Ich weiß dass das eigentlich irgendwie gehen müsste nur stehe ich irgendwie total auf dem schlauch und mache jetzt schon ewig mit der einen Funktion herum. Ich möchte die Funktionsweise von PHPs array_flip() in JavaScript nachbauen. Bisher bin ich so weit gekommen:

    function array_flip (orginal) {  
  
        var flipped = new Object;  
  
        for(var j in orginal) flipped[orginal[j]] = orginal[j].name;  
  
        return flipped;  
    }  
  
    var a = {  
               "foo"   : 0,  
               "bar"   : 1,  
               "code"  : 2,  
               "hello" : 3,  
               "world" : 4  
            };  
  
    a = array_flip(a);  
  
    alert(a[3]);

Dabei bekomme ich, dass a[3] undefined ist, warum das so ist glaube ich zu wissen, und zwar liegt es an orginal[j].name konkret an diesem name, das gibt nicht den key aus, ich finde aber nichts entsprechenderes als dan, vielleicht kann mir einer auf die Sprünge helfen?

Grüße
Jeena Paradies

--
Open- vs. Closed Source Software - Verdienstmöglichkeiten | Jlog | Gourmetica Mentiri
  1. Hallo,

    Oh mann, wie blöde man doch manchmal einfach ist. Jetzt probiere ich mindestens schon zwei Stunden daran herum und nichts funkitoniert, kaum habe ich es im Forum gepostet schon komme ich auf die Lösung:

    function array_flip (orginal) {

    var flipped = new Object;

    for(var j in orginal) flipped[orginal[j]] = j;

    return flipped;
        }

    var a = {
                   "foo"   : 0,
                   "bar"   : 1,
                   "code"  : 2,
                   "hello" : 3,
                   "world" : 4
                };

    a = array_flip(a);

    alert(a[3]);

      
    j hat ja schon an sich den Key als strin in sich, deshalb kann ich es auch einfach flipped[orginal[j]] zuweisen und bekomme genau das umgedrehte Ergebnis.  
      
    Grüße  
    Jeena Paradies
    
    -- 
    [Open- vs. Closed Source Software](http://jeenaparadies.net/weblog/2005/dec/open-vs-closed-source-software) - Verdienstmöglichkeiten | [Jlog](http://jeenaparadies.net/webdesign/jlog/) | [Gourmetica Mentiri](http://jeenaparadies.net/gourmetica-mentiri/)
    
  2. Heißa, Jeena,

    for(var j in orginal) flipped[orginal[j]] = orginal[j].name;
    und zwar liegt es an orginal[j].name konkret an diesem name, das gibt nicht den key aus, ich finde aber nichts entsprechenderes als dan, vielleicht kann mir einer auf die Sprünge helfen?

    Naja, eine for/in-Schleife durchläuft doch alle Keys in einem Array/Object. Demnach hast du doch in j schon den Key stehen.

    Gautera!
    Grüße aus Biberach Riss,
    Candid Dauth

    --
    Ein Fußball-Fan? Noch auf der Suche eine Schlafmöglichkeit im Großraum Stuttgart für die WM 2006? Wie wäre es mit Herrenberg, einer gemütlichen Kleinstadt am Rande des Schönbuchs – von der Lage her ideal, auch für andere Vorhaben im Urlaub. Ferienwohnungen-Herrenberg.com.
    http://cdauth.de/
    1. Hallo,

      Naja, eine for/in-Schleife durchläuft doch alle Keys in einem Array/Object. Demnach hast du doch in j schon den Key stehen.

      Danke, manchmal steht man wie gesagt echt auf dem Schlauch ;-).

      Grüße
      Jeena Paradies

      --
      Open- vs. Closed Source Software - Verdienstmöglichkeiten | Jlog | Gourmetica Mentiri
  3. Hallo Jeena,

    Du kannst btw. auch den Prototypen des Array-Objekts erweitern:

    Array.prototype.flip = function () {  
      var flipped = new Array();  
      for(var i in this) {  
        if (i == 'flip') continue;  
        flipped[this[i]] = i;  
      }  
      return flipped;  
    }
    

    Dann kannst Du das ganze auch so schreiben:

    newarray = oldarray.flip();
    (sofern oldarray ein beliebiges Objekt es Typs Array ist, wenn Du lieber mit Object arbeitest, kannst Du auch Object.prototype ändern (und new Object statt new Array in die Funktion reinschreiben) - allerdings ist flip() dann für *jedes* Objekt definiert)

    Die Geschichte hat nur einen Nachteil: Jedes Array enthält dann auch ein Element "flip", das auf die Funktion "flip" zeigt, d.h. in Schleifen, die alle Elemente durchgehen, musst Du das gesondert behandeln (siehe die obige Funktion selbst).

    Viele Grüße,
    Christian

    1. Hallo,

      (sofern oldarray ein beliebiges Objekt es Typs Array ist, wenn Du lieber mit Object arbeitest,

      Es ging mir vor allem darum ein "assoziatives Array" mit Strings als Keys zu flippen, so weit ich JavaScript verstanden habe muss man das über Objekte und ihre Eigenschaften abbilden, oder nicht?

      Die Geschichte hat nur einen Nachteil: [...]

      Ok, jetzt weiß ich welche Nachteile diese Form hat, nur verstehe ich noch nicht ganz welche Vorteile sie hat... Das einzige was mir einfällt ist, dass man es dann auch wie alle anderen Methoden von Objekten anwenden kann ohne da jetzt deshalb einen Unterschied deshalb machen zu müssen. Wobei ich noch nicht so ganz durchblicke warum das einfacher ist ;-).

      Grüße
      Jeena Paradies

      --
      Open- vs. Closed Source Software - Verdienstmöglichkeiten | Jlog | Gourmetica Mentiri
      1. Hallo Jeena,

        (sofern oldarray ein beliebiges Objekt es Typs Array ist, wenn Du lieber mit Object arbeitest,
        Es ging mir vor allem darum ein "assoziatives Array" mit Strings als Keys zu flippen, so weit ich JavaScript verstanden habe muss man das über Objekte und ihre Eigenschaften abbilden, oder nicht?

        Bei SELFHTML ist unter Beachten Sie im Abschnitt <http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays@title=JavaScript: Assoziative Arrays> einiges an Erklärung dazu - und wenn Du wirklich assoziative Arrays flippen willst (indizierte kann man ja genauso flippen, sofern die Werte nur Zahlen sind), dann dürfte Object wohl besser sein, als Array. Du kannst aber auch Array verwenden, es bringt nur keinen Vorteil gegenüber Object. Wobei sich dann natürlich die Frage stellt, ob man flip() wirklich als Prototypen für *alle* Objekte definieren will.

        Die Geschichte hat nur einen Nachteil: [...]
        Ok, jetzt weiß ich welche Nachteile diese Form hat, nur verstehe ich noch nicht ganz welche Vorteile sie hat... Das einzige was mir einfällt ist, dass man es dann auch wie alle anderen Methoden von Objekten anwenden kann ohne da jetzt deshalb einen Unterschied deshalb machen zu müssen. Wobei ich noch nicht so ganz durchblicke warum das einfacher ist ;-).

        Es ist wohl einfach ne Stilfrage, ob Du das so haben willst (bzw. wenn Du's als prototype für Object definierst, haben alle Objekte diese Methode, was problematisch sein könnte).

        Viele Grüße,
        Christian

    2. Du kannst btw. auch den Prototypen des Array-Objekts erweitern:

      Da es ja um kein Array geht, sondern um ein Objekt, sollte er lieber Object erweitertn.

      Object.prototype.flip = function()  
      {  
          var flipped = {};  
          for(var j in this) flipped[ this[j] ] = j;  
        
          return flipped;  
      }  
        
      var a = {  
           foo   : 0,  
           bar   : 1,  
           code  : 2,  
           hello : 3,  
           world : 4  
      };  
        
      var b = a.flip();  
        
      alert(b[3]);  
      
      

      Struppi.