Objekt zugriff

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekt zugriff

    ou weia, ich mal wieder.

    hatte ich mal erwähnt, das ich Javascript eigentlich nicht mag

    folgendes Problem.
    in einem Objekt, welches ich abarbeiten muss gibt es folgende Situation:
    Code:
    level1.level2.level3.level4
    (in meinem objekt sind leider noch tiefere verschachtelungen möglich)
    wobei manche Ebenen nicht immer vorhanden sind.
    Wie bekomme ich nun raus, ob eine ebene existiert, dessen "vorebene" auch schon nicht da ist.
    ich kann zwar mit
    Code:
    if (level1.level2.level3.level4){.. tuwas..}
    prüfen ob level 4 da ist, aber das geht nicht, wenn level 3 auch schon nicht vorhanden ist.

    im moment mach ich halt für die werte die ich brauche verschachtelte abfragen:

    Code:
    if (level1.level2.level3)
    {
           if (level1.level2.level3.level4)
               { .. tu was .. }
    }
    da manche ebenen aber übelst lang sind und ich ein paar von den tiefsten ebenen brauche verschachtele ich mir ja nen wolf

    muss ich immer diese verschachteten ifs bauen oder gibt es eine einfachere lösung ?
    EDIT:

    Beispiel eines ifs....


    Code:
    if(place.AddressDetails.
    Country.AdministrativeArea.
    SubAdministrativeArea.Locality.DependentLocality)
    	{
    	if(place.AddressDetails.
    Country.AdministrativeArea.
    SubAdministrativeArea.Locality.
    DependentLocality.DependentLocalityName)
    	{
    	alert ("da");
    	}
    	}
    Zuletzt geändert von ; 11.03.2009, 15:10.

  • #2
    Das Stichwort lautet: Rekursion.

    Hier ist übrigens noch ein imho recht guter Artikel dazu, allerdings in PHP: Recursion In PHP

    P.S. Um Rekursion zu verstehen, muss man Rekursion verstehen

    Grüße
    Zuletzt geändert von Griecherus; 11.03.2009, 15:41.
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      ahjo, Rekursion ist mir ein Begriff. Ich archiviere mit einer PHP Rekursion unseren Server (also die kundenordner, so ca 5000)
      aber wenn da das böse wort Javascript nicht wäre

      ich ha nichtmal ansatzweise einen schimmer wie ich rekursiv auf das objekt zugreiffen soll.

      aber ich versuch mal ein wenig herum

      Kommentar


      • #4
        Typeof ist dein Freund:

        if (typeof ebene1 != "undefined")
        if (typeof ebene1.ebene2 != "undefined")
        ...

        Es geht aber m.W. nicht ohne das Prüfen jeder einzelnen Ebene.
        Dafür müßtest Du dir eine eigene Funktion bauen.

        Kommentar


        • #5
          danke ich hatte sowas befürchtet :/

          ich hatte schon kurz an toSource() gedacht und dann parsen, wobei das im IE nicht korrekt funktioniert.

          ich meld mich wenn ich a) ne lösung gefunden hab oder b) zu alt geworden bin für den kram

          Kommentar


          • #6
            Schau auch mal bei den großen Frameworks, Prototype und JQuery usw.. Vielleicht haben die sowas in der Richtung, oder zumindest Hilfsfunktionen.

            Kommentar


            • #7
              Du kannst dir, wenn du das rekursiv prüfen willst, ein Array anlegen, in dem die Bezeichner, die du auf den jeweiligen Ebenen abfragen willst, abgelegt sind.

              Und dann machst du dir zu Nutze, dass man auf objekt.blubb auch über objekt["Blubb"] bzw. objekt[stringVariableDieDenWertBlubbEnthält] zugreifen kann.

              So kannst du mit dem objekt starten, und prüfen ob es als Untereigenschaft das besitzt, was als erstes in deinem Array steht. Wenn ja, dann speicherst du dir die Referenz darauf - und machst damit dann wiederum mit der nächsten Ebene weiter.

              Code:
              var EbenenBezeichner = ["Ebene1", "Ebene2, "Ebene3"];
              var objektReferenz = deinStartObjekt;
              while(objektReferenz[aktuellesArrayelement] existiert) {
                objektReferenz = objektReferenz[aktuellesArrayelement];
                aktuellesArrayelement = naechstesArrayElement;
              }
              Innerhalb der Schleife musst du dann noch die Ebenen mitzählen, um am Ende sagen zu können, ob alle bis zur letzten existiert haben.
              Oder du machst es gleich mit 'ner For-Schleife, denn die Anzahl zu prüfender Ebenen kennst du ja - und "break"st dann aus dieser einfach aus, wenn eine Ebene nicht vorhanden ist.

              Wirkliche Rekursion mit verschachtelten Funktionsaufrufen braucht man dann gar nicht wirklich - die "Rekursion" findet quasi an der Stelle statt, wo man objektReferenz immer wieder mit der Referenz auf das Objekt auf der nächsten Unterebene überschreibt.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                so, danke für die anregungen, ich bau es gleich mal ein und hoffe dann das fertige schnipsel präsentieren zu können

                Kommentar


                • #9
                  ok, das hab ich nun soweit, allerdings muss ich gleich noch ne RTFM frage stellen, die ich aber irgendwie nicht wirklich hinbekomm

                  Das Prinzip funktioniert gut, ich kann die Funktion mit verschiedenen Schemata füttern:

                  Code:
                  schema1 = 
                  	["AddressDetails",
                  	 "Country",
                  	 "AdministrativeArea",
                  	 "SubAdministrativeArea",
                  	 "Locality",
                  	 "DependentLocality",
                  	 "DependentLocalityName"];
                  	route = place; // place beinhaltet das original Objekt
                  	last_objekt=solve_objekt(schema1,0);
                  	
                  	function solve_objekt(schema,level)
                  	{
                  	if (typeof route[schema[level]] != "undefined")
                  		{	
                  			route=route[schema[level]]
                  			level++;
                  			solve_objekt(schema,level);
                  		}
                  	else 
                  		{	
                  		if (typeof route == "string")
                  		{return route;}
                  		else
                  		{return null;}
                  		}
                  	}
                  allerdings müsste ich mit dem Scriptablauf warten, bis die Funktion fertig ist. Und nun warscheinlich die RTFM Frage.
                  Wie kann ich das Sript anhalten, bis die Funktion durchgelaufen ist.

                  EDIT:

                  ich gehe grad noch auf die while variante ein. das teste ich grad noch

                  Zuletzt geändert von ; 12.03.2009, 12:31.

                  Kommentar


                  • #10
                    ok, variante 2:
                    Code:
                    level=0;
                    schema1 = 
                    ["AddressDetails",
                    "Country",
                    "AdministrativeArea",
                    "SubAdministrativeArea",
                    "Locality",
                    "DependentLocality",
                    "DependentLocalityName"];
                    route = place;
                    while (typeof route != "undefined") 
                    {	
                    	var route=route[schema1[level]];
                    	level++;
                    	if (typeof route == "string") {break;};
                    }
                    if (typeof route == "string")
                    {
                    alert (route); // weiterverarbeitung
                    }
                    diese variante hätte letztendlich den längeren code, da ich für jedes schema ne neue while machen müsste, alerdings hab ich nix mehr mit timeout am hut

                    danke für die denkanstösse, hab durchs testen einiges dazugelernt

                    EDIT:

                    Code:
                    while (route)
                    {
                    ..
                    }
                    würde in dem fall sogar reichen

                    Zuletzt geändert von ; 12.03.2009, 13:33.

                    Kommentar


                    • #11
                      sodale, hab mich nach bischen rumtesten für variante 2 entschieden.

                      OffTopic:

                      wenn mal jemand auf die wahnwitzige idee kommen sollte, ein revers geocodiertes objekt von google maps aufzudröseln, kann ich ihm da nun ne ecke weiterhelfen

                      Kommentar


                      • #12
                        nochmal ich mit ein wenig beispielkrams

                        wer lust hat schaut es sich mal an, es ist abenteuerlich, in welcher form die daten zurückgeliefert werden :/

                        http://www.mibau-datendesign.de/cont...ing/index.html

                        in diesem beispiel sind 3 objekte geokodiert, aller 3 haben eine "AddressLine" und alle an einer anderen stelle.

                        ich empfehle hier Firefox zu nutzen, da werden auch die rohdaten des objekts angezeigt
                        Zuletzt geändert von ; 13.03.2009, 00:16.

                        Kommentar

                        Lädt...
                        X