Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Ein Level des Objektbaums auslesen?

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Ein Level des Objektbaums auslesen?

    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      heikoW last edited by

      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 paul53 2 Replies Last reply Reply Quote 0
      • F
        Fabian1 @heikoW last edited by 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 1 Reply Last reply Reply Quote 0
        • H
          heikoW @Fabian1 last edited by

          @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
          
          paul53 1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active last edited by mickym

            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

            1 Reply Last reply Reply Quote 1
            • paul53
              paul53 @heikoW last edited by

              @heikow sagte: getKeys is not defined

              Ich kenne diese Funktion auch nicht.

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @heikoW last edited by paul53

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

                1 Reply Last reply Reply Quote 1
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                888
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                4
                6
                235
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo