NEWS
Ein Level des Objektbaums auslesen?
-
Hallo,
ich habe einen Objektbaum wie:
alias.0.root
alias.0.root.item_1
alias.0.root.item_1.subitem_1
alias.0.root.item_1.subitem_2
alias.0.root.item_2
alias.0.root.item_2.subitem_a
usw.
Ich möchte eine Ebene "ausklappen" und sehen was drin ist. Also z.B alias.0.root auslesen und ['item_1','item_2'] bekommen.Momentan mache ich das mit einer function
function readTreeLevel(root,inc) { var elementList=[] var element var n=root.split(".").length-1+inc $("[id="+root+".*]").each(function (id, i) { element=id.split(".")[n] if ( ! elementList.includes(element) ) { elementList.push(element)} }); return elementList } var start="alias.0.root" var items=readTreeLevel(start,1)
Das funktioniert, aber bewegt ja jede Menge unnötige Daten. Gibt's da ein Bordmittel für, das ich übersehen habe?
-
@heikow said in Ein Level des Objektbaums auslesen?:
Hallo,
ich habe einen Objektbaum wie:
alias.0.root
alias.0.root.item_1
alias.0.root.item_1.subitem_1
alias.0.root.item_1.subitem_2
alias.0.root.item_2
alias.0.root.item_2.subitem_a
usw.
Ich möchte eine Ebene "ausklappen" und sehen was drin ist. Also z.B alias.0.root auslesen und ['item_1','item_2'] bekommen.
Momentan mache ich das mit einer function// Funktion zum Auslesen der direkten Kinder eines Objektbaums function readTreeLevel(root, callback) { // Alle Objekte unterhalb von root.* abfragen getKeys(root + ".*", function (err, keys) { if (err) { log("Fehler beim Lesen der Keys: " + err, 'error'); callback([]); return; } var startDepth = root.split('.').length; var directChildren = []; keys.forEach(function(key) { var parts = key.split('.'); // Wir wollen nur die Objekte, die genau eine Ebene tiefer liegen: // Wenn root = "alias.0.root" ist und wir haben "alias.0.root.item_1", // dann liegt dieses Objekt genau eine Ebene darunter. if (parts.length === startDepth + 1) { directChildren.push(parts[parts.length - 1]); } }); callback(directChildren); }); } // Beispielhafte Verwendung: var start = "alias.0.root"; readTreeLevel(start, function(children) { log("Direkte Kinder von " + start + ": " + JSON.stringify(children)); });
-
@fabian1 Ich glaub, ich muss noch gaanz viel mehr javascript lernen
Allerdings bekomme ich beim testen:error script.js.common.test: ReferenceError: getKeys is not defined
-
Mit NodeRed kannst Du das einfach machen - da Du mit regulären Ausdrücken arbeiten kannst.
Die States unter sensor1 etc. werden einfach ausgefiltert mit einem regulären Ausdruck
Test\.(?!.*\.).*$
Anstelle von 50 States werden also nur die 19 1st Level States geliefert und das ganz ohne Programmieraufwand.
Wenn man nicht nur die States sondern alles auf dem 1st Level haben will, dann kann man die Folder etc miteinschließen, in dem man in der List Node nicht nur nach States filtert, sondern alle Objekte zu ässt.
Also hier sind senor1 und sensor2 auch dabei - obwohl dass keine States sind.
Nur States dann bei Type spezifizieren.
Oder nur Type Folder selektieren: -
@heikow sagte: getKeys is not defined
Ich kenne diese Funktion auch nicht.
-
@heikow sagte: bewegt ja jede Menge unnötige Daten.
Das lässt sich nicht vermeiden, da der Javascript-Adapter zur Suche in der ID-Struktur nur den $Selektor bietet, der Datenpunkte sucht. Das Erstellen des Selektor-Objektes ist die aufwändigste Funktion im Skript. Die Schleife ist dagegen harmlos.