HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS Probleme mit HTML5, Bootstrap oder jQuery ? |
 |

11-03-2009, 16:07
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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");
}
}
Geändert von Peacie (11-03-2009 um 16:10 Uhr)
|

11-03-2009, 16:37
|
Griecherus
PHP Senior
|
|
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
|
|
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
Geändert von Griecherus (11-03-2009 um 16:41 Uhr)
|

11-03-2009, 16:58
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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
|

11-03-2009, 17:13
|
pekka
PHP Master
|
|
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
|
|
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.
|

11-03-2009, 17:30
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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
|

11-03-2009, 17:32
|
pekka
PHP Master
|
|
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
|
|
Schau auch mal bei den großen Frameworks, Prototype und JQuery usw.. Vielleicht haben die sowas in der Richtung, oder zumindest Hilfsfunktionen.
|

11-03-2009, 19:35
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
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.
|

12-03-2009, 12:07
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
so, danke für die anregungen, ich bau es gleich mal ein und hoffe dann das fertige schnipsel präsentieren zu können
|

12-03-2009, 13:25
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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 
Geändert von Peacie (12-03-2009 um 13:31 Uhr)
|

12-03-2009, 14:25
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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
Geändert von Peacie (12-03-2009 um 14:33 Uhr)
|

12-03-2009, 14:50
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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 
|

13-03-2009, 01:11
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
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
Geändert von Peacie (13-03-2009 um 01:16 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|