Marco: Mehrdimensionales Assoziatives Array

Hallo

Ich habe folgendes Script

var domains = new Array();

domains["com"]        = new Object();
domains["com"]["EIGENSCHAFT"]      = "A";
domains["com"]["google"]          = new Object();
domains["com"]["google"]["EIGENSCHAFT"]    = "B";
domains["com"]["google"]["www"]    = new Object();
domains["com"]["google"]["www"]["EIGENSCHAFT"] = "C";

function GetEigenschaftForDomain(dom) {
   // ??
}

Nun möchte ich die Methode GetEigenschaftForDomain() so schreiben, dass sie mir z.B. für GetEigenschaftForDomain("google.com") den Wert "B" zurückgibt.

Wie macht man das bei unterschiedlichen Array-Längen?

Gruss Marco

  1. hi,

    hattest du zu deiner frage nicht schon in deinem ersten thread vor ein paar tagen ausreichend hinweise und vorschläge erhalten ...?

    Nun möchte ich die Methode GetEigenschaftForDomain() so schreiben, dass sie mir z.B. für GetEigenschaftForDomain("google.com") den Wert "B" zurückgibt.

    prüfe, ob domains["com"] existiert.
    wenn ja: prüfe, ob domains["com"]["google"] existiert.
    wenn ja und wenn keine weiter "suchebene" vorhanden ist: prüfe, ob domains["com"]["google"]["EIGENSCHAFT"] existiert.
    wenn ja: gebe den wert von domains["com"]["google"]["EIGENSCHAFT"] zurück.

    Wie macht man das bei unterschiedlichen Array-Längen?

    suchbegriff am punkt aufsplitten, und dann in einer schleife wie oben beschrieben prüfen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo

      Ich habe nun folgendes:

      function GetValueForDomain(dom) {
          var s;
          arr = dom.split(".");

      switch ( arr.length ) {
       case 1: s = domains[arr[0]]["EIGENSCHAFT"];
       case 2: s = domains[arr[1]][arr[0]]["EIGENSCHAFT"];
       case 3: s = domains[arr[2]][arr[1]][arr[0]]["EIGENSCHAFT"];
          }

      alert (s);
      }

      Ich möchte aber das switch-Statement irgendwie durch eine Schleife ersetzen. Arr.Length könnte ja theoretisch sehr gross sein und ich möchte nicht für jede Länge ein case erstellen. Ist das Möglich?

      Zudem ergibt mir das Script momentan noch einen Fehler aus und ich weiss nicht warum...

      Gruss Marco

      1. hi,

        Ich möchte aber das switch-Statement irgendwie durch eine Schleife ersetzen. Arr.Length könnte ja theoretisch sehr gross sein und ich möchte nicht für jede Länge ein case erstellen. Ist das Möglich?

        ja.

        Zudem ergibt mir das Script momentan noch einen Fehler aus und ich weiss nicht warum...

        ich auch nicht. eine meldung á la "hoppsala, es ist 'irgendein fehler' aufgetreten" bringt kein mir bekannter browser.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. function GetValueForDomain(dom) {
            var s;
            arr = dom.split(".");

        switch ( arr.length ) {
        case 1: s = domains[arr[0]]["EIGENSCHAFT"];
        case 2: s = domains[arr[1]][arr[0]]["EIGENSCHAFT"];
        case 3: s = domains[arr[2]][arr[1]][arr[0]]["EIGENSCHAFT"];
            }

        alert (s);
        }

        du solltest dir mal die Funktionsweise von switch durchlesen.

        Ich möchte aber das switch-Statement irgendwie durch eine Schleife ersetzen. Arr.Length könnte ja theoretisch sehr gross sein und ich möchte nicht für jede Länge ein case erstellen. Ist das Möglich?

        Also mein Gefühl nach den ganzen Fragen ist, das dein Datenstruktur für deine speziellen Anwendungsfall nicht optimal ist.

        Aber es geht.

          
        function GetValueForDomain(dom) {  
            var arr = dom.split(".");  
            var check = domains[ arr.pop() ];  
            var last;  
            while( check = check[ arr.pop() ] )  
            {  
            last = check;  
            }  
            return last["EIGENSCHAFT"];  
        }  
          
        
        

        Struppi.

        1. hi,

          Also mein Gefühl nach den ganzen Fragen ist, das dein Datenstruktur für deine speziellen Anwendungsfall nicht optimal ist.

          ey pass opp, doh!
          die hatten Christoph Zurnieden und meine wenigkeit ihm doch extra vorgeschlagen!

          (aber ggf. effektivere alternativvorschläge werden natürlich auch noch gern genommen [nehme ich zumindest an].)

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Also mein Gefühl nach den ganzen Fragen ist, das dein Datenstruktur für deine speziellen Anwendungsfall nicht optimal ist.

            ey pass opp, doh!
            die hatten Christoph Zurnieden und meine wenigkeit ihm doch extra vorgeschlagen!

            Ich hatte den auch mitverfolgt, aber die ganze Zeit nicht so richtig verstanden was da gemacht werden soll, bzw. auch kaum Muse mir den genauer anzuschauen.

            (aber ggf. effektivere alternativvorschläge werden natürlich auch noch gern genommen [nehme ich zumindest an].)

            Nee, mit fällt jetzt auch kein besserer Vorschlag ein.

            Struppi.

        2. Hallo

          du solltest dir mal die Funktionsweise von switch durchlesen.

          Jetzt seh ichs, hab den break vergessen...

          Aber es geht.

          function GetValueForDomain(dom) {
              var arr = dom.split(".");
              var check = domains[ arr.pop() ];
              var last;
              while( check = check[ arr.pop() ] )
              {
              last = check;
              }
              return last["EIGENSCHAFT"];
          }

            
          Super. Vielen Dank.  
            
          Gruss Marco
          
  2. var domains = new Array();

    Verwende hier auch Object() da domains kein Array ist und daher auch keine Länge hat.

    domains["com"]        = new Object();
    domains["com"]["EIGENSCHAFT"]      = "A";
    domains["com"]["google"]          = new Object();
    domains["com"]["google"]["EIGENSCHAFT"]    = "B";
    domains["com"]["google"]["www"]    = new Object();
    domains["com"]["google"]["www"]["EIGENSCHAFT"] = "C";

    function GetEigenschaftForDomain(dom) {
       // ??
    }

    Nun möchte ich die Methode GetEigenschaftForDomain() so schreiben, dass sie mir z.B. für GetEigenschaftForDomain("google.com") den Wert "B" zurückgibt.

    Wenn du darauf hinaus willst, dass du den String immer am Punkt trennst, dann hilft dir wie wahsaga schon sagte split()

    Wie macht man das bei unterschiedlichen Array-Längen?

    Welches Array?

    Struppi.

  3. Hallo Marco,

    ich vermute, was Du eigentlich suchst, ist eine rekursive Funktion. Dann kannst Du auf jeder Rekursionsebene abfragen, ob es die Eigenschaft "EIGENSCHAFT" gibt. Und wenn nicht, rufst Du die Funktion wieder auf, sonst fragst Du den Wert für "EIGENSCHAFT" ab. Ich verwende sowas in meinem aktuellen Projekt auch gerade.

    Gruß, Andreas

    --
    SELFFORUM - hier werden Sie geholfen,
    auch in Fragen zu richtiges Deutsch