Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Ein Level des Objektbaums auslesen?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    14
    1
    168

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    12
    1
    570

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.8k

Ein Level des Objektbaums auslesen?

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 4 Kommentatoren 482 Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • H Offline
    H Offline
    heikoW
    schrieb am zuletzt editiert von
    #1

    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?

    F paul53P 2 Antworten Letzte Antwort
    0
    • H heikoW

      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?

      F Offline
      F Offline
      Fabian1
      schrieb am zuletzt editiert von Fabian1
      #2

      @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));
      });
      
      
      
      H 1 Antwort Letzte Antwort
      0
      • F Fabian1

        @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));
        });
        
        
        
        H Offline
        H Offline
        heikoW
        schrieb am zuletzt editiert von
        #3

        @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
        
        paul53P 1 Antwort Letzte Antwort
        0
        • mickymM Offline
          mickymM Offline
          mickym
          Most Active
          schrieb am zuletzt editiert von mickym
          #4

          Mit NodeRed kannst Du das einfach machen - da Du mit regulären Ausdrücken arbeiten kannst.

          8dc2be2e-634e-44f1-b553-17c00cbec7cb-image.png

          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. :)

          d7f03cc2-3586-4d0a-86f2-b01aaebd5627-image.png

          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.

          cbabf6ca-de3b-47b5-908b-c9c038ec4bfa-image.png

          Also hier sind senor1 und sensor2 auch dabei - obwohl dass keine States sind.
          277d9ada-5050-4869-8ba8-c9b410db75a1-image.png

          Nur States dann bei Type spezifizieren.
          Oder nur Type Folder selektieren:

          d80e56fe-a1b4-4fd8-994e-9f34f60cca0d-image.png

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          1 Antwort Letzte Antwort
          1
          • H heikoW

            @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
            
            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #5

            @heikow sagte: getKeys is not defined

            Ich kenne diese Funktion auch nicht.

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            1 Antwort Letzte Antwort
            0
            • H heikoW

              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?

              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von paul53
              #6

              @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.

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              1 Antwort Letzte Antwort
              1
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              769

              Online

              32.5k

              Benutzer

              81.8k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe