JavaScript Objektpfad in Mehrdimensionalem Objekt per Variable aufrufen

DerTiger

Lt. Junior Grade
Registriert
Jan. 2006
Beiträge
364
Hi,

ich wusst jetzt echt nicht wie ich das besser beschreiben soll, aber ich steh vor folgendem Problem:

ich hab mehrere mehrdimensionales Objekte mit dem gleichen Aufbau, z.B.:

obj['channels']['channel'][0]['destinationConnectors']['connector'][0]['responseTransformer']['steps']['step'][0]
obj['channels']['channel'][0]['sourceConnector']['transformer']['steps']['step']['0']

etc.

diese Objekte haben mehrere solcher Pfade, und um nicht jedesmal diesen ellenlangen Pfad verwursten zu müssen, hätte ich diesen gerne in eine Variable gespeichert, eg:

var Pfad = ['channels']['channel'][0]['destinationConnectors']['connector'][0]['responseTransformer']['steps']['step'][0]
var Pfad2 = ['channels']['channel'][0]['sourceConnector']['transformer']['steps']['step']['0']

obj[Pfad]
obj[Pfad2]

obj2[Pfad]
obj2[Pfad2]

etc.

allerdings funktioniert das so wie angegeben nicht, da für den string in den Brackets nur eine einzelne Ebene funktioniert und ich dann wieder mehrere Brackets machen müsste, und nichts gewonnen hätte.

​hat da jemand ne Idee?
 
Hmm: Du kannst ja nen Verzeichnisobjekt erstellen, in dem unter kurzem Namen die Objekte abgespeichert werden.
Code:
​var dict={};
dict["short"]=obj[....[][][]];
​
​Bzw. wenn du es selbstreferenziert machen willst.
Code:
​obj["pfad"]=obj["a"]["b"];
​Was nicht geht ist, komplexe Objekte als den Schlüssel/Wertname zu verwenden. Da geht nur Strings (bei Objekte) und Integer (bei Arrays).
 
Man könnte sich eine Kopie der Property anlegen.

Code:
let prop = foo[...][...]

Prop kann dann ja alles mögliche sein.
 
Ein dict-objekt in der Richtung habe ich schon um die ganzen Pfade zu Speicher.

So wie in deinem Beispiel wäre das Objekt wieder mit drin, was dann heißt dass ich für jedes Objekt ein neues dict brauche, was ich wegen redundanz eigentlich vermeiden wollte, da die Pfade ja immer gleich sind.

Aber ich glaub ich werd wohl nicht drum rum kommen.
 
müsste es nicht so aussehen? javascript unterstützt keine strings als array keys
Code:
obj.channels.channel[0].destinationConnectors.connector[0].responseTransformer.steps.step[0]
 
Kannst du uns mehr Infos zu deinem Anwendungsfall geben?

Wenn ich sowas sehe:
Code:
obj['channels']['channel'][0]['destinationConnectors']['connector'][0]['responseTransformer']['steps']['step'][0]
würde ich eher davon ausgehen, das die beste Lösung schon viel früher ansetzt.

Ist das Datenmodel vorgegeben oder dein eigenes?
 
Die Struktur ist vorgegeben.
Ist das XML Backupfile eines Kommunikationsservers.
ich will die Konfiguration auslesen und in einer Dokumentation festhalten, sowie Änderungen in den Mappingscripten auslesen.
Um die Änderungen zu finden halte ich das angepasste Backup (obj1) gegen eine unmodifizierte Default-Installation (obj2) und geh die Scripte und Settings durch.
 
Vielleicht ist folgender Ansatz denkbar:

Code:
var Pfad = "['channels']['channel'][0]['destinationConnectors']['connector'][0]['responseTransformer']['steps']['step'][0]";
var Element = eval("obj" + Pfad);
Die eingebaute JavaScript-Funktion eval wird allerdings als "böse" bewertet.
Alternativ könnte man eine Funktion bauen, die so etwas wie einen Objekt-Selektor implementiert.

Code:
var Pfad = "channels.channel[0].destinationConnectors.connector[0].responseTransformer.steps.step[0]";

Dann ein split an den Punkten und in einer Schleife auswerten
 
Funktionen anyone?
Code:
function pfad( o )
{
  return o['channels']['channel'][0]['destinationConnectors']['connector'][0]['responseTransformer']['steps']['step'][0];
}

function pfad2( o )
{
  return o['channels']['channel'][0]['sourceConnector']['transformer']['steps']['step']['0'];
}

pfad( o ).foo
pfad2( o ).bar
 
Yuuri schrieb:
Funktionen anyone?

Jaa, so weit hab ichs in der zwischenzeit auch ausgeführt, mit der Funktion geht das. :D
Hatte nur gehofft es gäbe einen simpleren weg. :)

Aber ja, das funktioniert.
 
Das riecht förmlich nach XPath, damit kann man nämlich genau sowas machen -> Auf ein Element im XML-Tree runterselektieren - basierend auf einen Pfad.

Der XPath dafür wäre (Erster Index der Elemente ist bei XPath 1 und nicht 0!):
/channels/channel[1]/destination/Connectors/connector[1]/responseTransformer/steps/step[1]

Leider kann JavaScript das nicht nativ, daher musst du entweder ne einfachere Version für dich bauen oder ne Bibliothek suchen die das für dich macht.

Selber machen bedeutet nach / splitten und vom Root-Knoten aus Kindelement verschaltet oder im Stack zu suchen. Ist kein index im jeweiligen Teil enthalten ([Integer]), nimmst du immer den ersten Index. Am Ende bekommst du von deiner XPathEval Funktion entweder nen Element zurück oder null. Danach musst du dann ledliglich nur noch auf den InnerText zugreifen oder weiter verarbeiten, was auch immer du machen willst.

Ist eigentlich super leicht zu implementieren.
 
Okay, das klingt interessant... muss ich mir mal ansehen, thx. :)
 
Finalspace schrieb:
Ist eigentlich super leicht zu implementieren.
Wo ist da genau der Unterschied zu dem Vorschlag von kling1, außer dass du dir noch ne zusätzliche Abhängigkeit ans Bein bindest? Ob es nun Punkte als Trenner oder Slashes sind... Vollkommen Banane. Er will außerdem eine Verkürzung des Pfades haben, sonst nichts.
 
Zurück
Oben