Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
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
    17
    1
    3.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

Ein Level des Objektbaums auslesen?

Scheduled Pinned Locked Moved JavaScript
6 Posts 4 Posters 502 Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    heikoW
    wrote on last edited by
    #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 Replies Last reply
    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
      wrote on last edited by 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 Reply Last reply
      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
        wrote on last edited by
        #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 Reply Last reply
        0
        • mickymM Offline
          mickymM Offline
          mickym
          Most Active
          wrote on last edited by 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 Reply Last reply
          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
            wrote on last edited by
            #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 Reply Last reply
            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
              wrote on last edited by 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 Reply Last reply
              1
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              711

              Online

              32.6k

              Users

              82.3k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Home
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe