Javascript - Abfrage Attribut vorhanden

Bennyaa

Lieutenant
Registriert
März 2007
Beiträge
832
Hallo,

ich bekomme in javascript einen string rein.
Diese sieht bspw. so aus:
const mystring = "hauptordner.unterordner"
Im code vorhanden
const reachableFolders = {"hauptordner.unterordner":true}
die ist so gelöst und nicht in einem Array, damit man keine forschleife benötig.
Abgefragt wird das vorhandensein nun so:
if(reachableFolders[mystring])
das funktioniert soweit so gut.

ist es nun mit diesem Konstrukt irgendwie möglich (am besten natürlich ohne schleife)
abzufragen, ob ein attribut vorhanden ist, das innerhalb des string steht---als zu beginn)

sprich, wenn der string
const mystring = "hauptordner.unterordner.nochEinUnterordner"
lautet, soll erkannt werden, dass das attribut
"hauptordner.unterordner" besteht.

Also alle weiteren unterordner erlaub sind.
 
Ohne Schleife bzw. Iteration sehe ich keine Möglichkeit, aber prinzipiell ginge es folgendermaßen:
Javascript:
Object.entries(reachableFolders).some(([key, value]) => value && (key==mystring || mystring.startsWith(key+".")))
 
Zuletzt bearbeitet: (Fehler korrigiert)
Es steht und fällt damit wie gut du den Suchstring splitten kannst.

Letztendlich wird hier ein Dictionary benutzt, also key/value pairs, und mit rechableFolders[mystring] holst du dir anhand des keys mystring den dazugehörigen value raus. mystring muss in diesem konkreten Beispiel 1:1 "hauptordner.unterordner" lauten oder einen anderen gültigen Wert aus dem Object/Dictionary haben. Hängt an mystring noch etwas hintendran, wird der key nicht mehr gefunden.

Sofern dein Suchstring per Definition immer mit . getrennt ist, könntest du dir zB mit indexOf und substring oder search mit Hilfe von regex oder split('.') den relevanten ersten Teil bzw. die ersten Teile des Suchstrings rausfiltern und nur diese dann als key ans Dictionary geben.
 
Danke.... ja sobald ich aber substring usw. nutze, komme ich ja nicht um eine schleife herum.
Aber dann mache ich es mal so.
 
Was spricht eigentlich gegen eine Schleife? Performance? Lesbarkeit des Codes?
 
ging nur um die lesbarkeit.
Aber ein anderes Thema, kann ich in einem JSON auch funktionen definieren?
 
Nein. In JavaScript-Objekten, die wie JSON aussehen, geht das. Aber in JSON nicht.
 
Bennyaa schrieb:
die ist so gelöst und nicht in einem Array, damit man keine forschleife benötig.
warum nimmst du dafuer kein Set? Und selbst Arrays erlauben Methoden wie includes, find
Bennyaa schrieb:
lautet, soll erkannt werden, dass das attribut
"hauptordner.unterordner" besteht.
wie schon erwaehnt kommst du da nicht um das Iterieren deiner Datenstruktur rum. Es sei denn, die nutzt deine Dot Notation und baust dir ein verschachteltes Dictionary. Und nutze deine Anfrage dann auch dementsprechend. Oder du baust dir einen Baum auf. Alles natuerlich Overkill, dir geht es ja nicht um viele Daten und Prefix-Search - du willst warum auch immer nur keine Schleifen sehen
 
Worum geht es eigentlich allgemein? Routing und/oder Permissions? -> Verwende ein Framework.

Ansonsten, wenn es um gute Lesbarkeit geht, und es möglich ist, statt Punkt einen Schrägstrich als Trennzeichen zu verwenden (es geht ja um Ordner, da ist das eigentlich naheliegender), bietet sich für reachableFolders ein Array mit Glob-Patterns (z.B. hauptordner/unterordner/**) an, gegen den mystring dann mit Hilfe einer Library wie dieser gematcht werden kann.
 
Bennyaa schrieb:
ja sobald ich aber substring usw. nutze, komme ich ja nicht um eine schleife herum.
Wieso? Wenn die Notation mit den Punkten konsistent ist, suchst du zB mit indexOf('.') nach dem Index des ersten und anschließend einfach nochmal mit indexOf ab index1+1 nach dem zweiten Punkt. Anschließend substring(0, index2) und fertig.

Für die Lesbarkeit kann man das Parsen des Strings auch einfach in einer Funktion mit sprechendem Namen kapseln und dann siehst du die Implementierung nicht mehr.
 
@abcddcba ein Set sehe ich nicht als Vorteil an. Wozu?
Und wie soll mir includes oder find helfen, wenn die Attribute nur ein Teil des Strings sind.
Aber ok. Mache es normal mit ner Schleife.

@H4110 den String habe ich mir ja nicht ausgedacht. An dem System werden die Ordner mit . Getrennt.
 
Wenn du eh sozusagen Pfade als Ordnernamen bekommst, speichere doch gleich in einem Objekt mit diesen Keys:
ReachableFolders.ordera.ordnerb.ordnerc. Usw.
Da braucht man bei der Abfrage keine Schleife.
 
Zurück
Oben