Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Ersetzen eines json Array elements

    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

    [gelöst] Ersetzen eines json Array elements

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ben1983
      Ben1983 @ticaki last edited by Ben1983

      @ticaki ach ja du übergibst ne Funktion… jetzt. 😂

      hier mein code:

      // Abfrage, ob sich ein Türzustand geändert hat
      $(`state(${enumtypeFunctions}=${enumTuerAussen})`).on((dp)=>{
          // object auslesen
          const obj = getObject(dp.id);
      
      
      /***********************************************************
       * ******Generierung des Türarrays für die Userdaten********
       * ********************************************************/
          // Zusammensetzen der JSON Objekte (Abfrage aller Türen)
          let tueren = [];
          let offeneTueren = [];
          let geschlosseneTueren = [];
      
          $(`state(${enumtypeFunctions}=${enumTuerAussen})`).each((id)=>{ 
              const objName = getObject(id).common.name; 
              let myDoor = {};
              myDoor.name = objName;
              // Aktuelle Tür in das jeweilige Array pushen
              if(getState(id).val){
                  myDoor.zustand = "geschlossen";
                  geschlosseneTueren.push(myDoor);
              }
              else{
                  myDoor.zustand = "offen";
                  offeneTueren.push(myDoor);
              }
              tueren.push(myDoor); // Aktuelle Tür in das allgemeine Tür-Array pushen
          });
          // Schreiben der Werte in die JSON States
          setState(idTueren,JSON.stringify(tueren),true);
          setState(idOffeneTueren,JSON.stringify(offeneTueren),true);
          setState(idGeschlosseneTueren,JSON.stringify(geschlosseneTueren),true);
      
          if(offeneTueren.length === 0){
              return true;
          }
          else{
              return false;
          }
      });
      
      T 1 Reply Last reply Reply Quote 0
      • T
        ticaki Developer @Ben1983 last edited by ticaki

        @ben1983

                const myDB = {}
                $(`state(${enumtypeFunctions}=${enumTuerAussen})`).each((id) => {
                    myDB[id]= {name: getObject(id).common.name, zustand: getState(id).val }
                }
                // Abfrage, ob sich ein Türzustand geändert hat
                $(`state(${enumtypeFunctions}=${enumTuerAussen})`).on((dp) => {
                    // object auslesen
                    if (myDB[dp])  myDB[dp].zustand = dp.state.val;
                    else myDB[dp] = {name: getObject(dp.id).common.name, zustand: dp.state.val  }
                    /***********************************************************
                     * ******Generierung des Türarrays für die Userdaten********
                     * ********************************************************/
                    // Zusammensetzen der JSON Objekte (Abfrage aller Türen)
                    const tueren = Object.values(myDB);
                    const offeneTueren = tueren.filter(a => a && a.zustand);
                    const geschlosseneTueren = tueren.filter(a => a && !a.zustand);
        
                    // Schreiben der Werte in die JSON States
                    setState(idTueren, JSON.stringify(tueren), true);
                    setState(idOffeneTueren, JSON.stringify(offeneTueren), true);
                    setState(idGeschlosseneTueren, JSON.stringify(geschlosseneTueren), true);
        
                    if (offeneTueren.length === 0) {
                        return true;
                    } else {
                        return false;
                    }
                });
        

        Habs in einem Typescript adapter geschrieben, also syntax könnte richtig sein 😄

        kommt nur nicht mit entfernten türen klar, da muß das Skript neugestartet werden. Vorteil ist es werden nich zig unnötige Anfragen an den Javascript-adapter geschickt.

        Ben1983 1 Reply Last reply Reply Quote 0
        • Ben1983
          Ben1983 @ticaki last edited by Ben1983

          @ticaki ok.
          Ganz cool.
          Schaue ich mir auf jeden Fall morgen mal an.

          Es wird nicht bei dem on ein kompletter Durchlauf der Elemente gemacht, auch ein entfernen ist nicht notwendig => sehr gut…
          Aber:
          Durchläuft nicht find auch jedes Element ?
          Somit wäre es ja gleich zu setzen mit dem each, oder?

          Aber die Sache mit Object.values() ist denke ein Ansatz für mich,

          So könnte ich wie bei dir mit Objekten arbeiten und dann delete nutzen usw. Ich schaue mal rein.

          T 1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @Ben1983 last edited by ticaki

            @ben1983

            ich benutze hier filter und auch das testet jedes Element im array, aber das array ist script intern, dürfte erheblich schneller sein, als wenn du erst noch eine Filteranfrage (selector) an den Javascript-Adapter schickst. Ist auch nur eine Idee 🙂

            das getObject in deinem Code könnte genauso lange dauern wie das filtern des Arrays. Aber lesbarkeit geht vor effizenz! meistens 🙂

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

              @ticaki sagte: lesbarkeit geht vor effizenz!

              Funktionen, die man nur sehr selten verwendet - man also nachschlagen muss, erhöhen nicht die Lesbarkeit.

              T 1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @paul53 last edited by

                @paul53
                Naja .each ist wohl deutlich exotischer als array.filter()

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

                  @ticaki sagte: .each ist wohl deutlich exotischer als array.filter()

                  Nicht in Verbindung mit dem $Selector.

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @paul53 last edited by ticaki

                    @paul53
                    Dann ist das wohl an mir vorübergegangen. 100 Skript 0 mal each(oder eine der anderen Spezialfunktionen für selektoren), rund 60 mit selectoren. Ich mag forEach() aber genauso wenig. 🙂

                    EDIT: ist aber nicht relevant, der TE hat die selektoren in ein array von objecten umgebaut und in dem Kontext sind die standard array funktion nicht mehr exotisch.

                    Ben1983 2 Replies Last reply Reply Quote 0
                    • Ben1983
                      Ben1983 @ticaki last edited by

                      @ticaki vergleich mein code: 8ms

                      der code nach deinem schema:

                      $(`state(${enumtypeFunctions}=${enumTuerInnen})`).on((dp)=>{
                          log("Start");
                          let obj = getObject(dp.id);
                          tueren[dp.id] = {name:obj.common.name, zustand:dp.state.val};
                          if(dp.state.val){
                              geschlosseneTueren[dp.id] = {name:obj.common.name, zustand:dp.state.val};
                              delete geschlosseneTueren[dp.id];
                          }
                          else {
                              geschlosseneTueren[dp.id] = {name:obj.common.name, zustand:dp.state.val};
                              delete offeneTueren[dp.id];
                          }
                          setState(idTueren,JSON.stringify(Object.values(tueren)),true);
                          setState(idOffeneTueren,JSON.stringify(Object.values(offeneTueren)),true);
                          setState(idGeschlosseneTueren,JSON.stringify(Object.values(geschlosseneTueren)),true);
                          log("Ende");
                      
                      });
                      

                      1-2ms

                      1 Reply Last reply Reply Quote 0
                      • Ben1983
                        Ben1983 @ticaki last edited by

                        @ticaki die Frage ist ja… Array ist so ok? Intern (im Skript) mi Objekten ist etwas komfortabler.
                        Dann mit Object.values zum Array machen… weil nachher im State ist doch sicher einer Arraystruktur besser, als Objekte… die immer gleich sind, oder?

                        T 1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @Ben1983 last edited by ticaki

                          @ben1983

                          Ich finde array für die Ausgabe am passenden.

                          Ben1983 1 Reply Last reply Reply Quote 1
                          • Ben1983
                            Ben1983 @ticaki last edited by Ben1983

                            @ticaki OK, da bin ich ja beruhigt.

                            Hier mein Komplettes Skript zum Zuweisen:

                            // Id Deklaration der States (für spätere Abrufe)
                            const idOffeneTueren = "0_userdata.0.Produktiv.Tueren.Innen.offeneTueren";
                            const idGeschlosseneTueren = "0_userdata.0.Produktiv.Tueren.Innen.geschlosseneTueren";
                            const idTueren = "0_userdata.0.Produktiv.Tueren.Innen.tueren";
                            
                            // Türobjekte definieren
                            let tueren = {};
                            let offeneTueren = {};
                            let geschlosseneTueren = {};
                            
                            //Arrays bei Skriptstart anlegen
                            $(`state(${enumtypeFunctions}=${enumTuerInnen})`).each((id)=>{
                                //objekt und state holen
                                let obj = getObject(id);
                                let state = getState(id);
                            
                                // Objekte zuweisen
                                assignObject(obj,state);
                            
                                // Arrays beschreiben
                                setState(idTueren,JSON.stringify(Object.values(tueren)),true);
                                setState(idOffeneTueren,JSON.stringify(Object.values(offeneTueren)),true);
                                setState(idGeschlosseneTueren,JSON.stringify(Object.values(geschlosseneTueren)),true);
                            
                            });
                            
                            // Objekte zuweisen
                            function assignObject(obj,state){
                                // Zuweisen des allgemeinen Türobjekts
                                tueren[obj._id] = {name:obj.common.name, zustand: state.val?"geschlossen": "offen"};
                                
                                // Zuweisen des Objekts für die offenen oder geschlossenen Türen
                                if(state.val){
                                    geschlosseneTueren[obj._id] = tueren[obj._id];
                                    delete offeneTueren[obj._id];
                                }
                                else {
                                    offeneTueren[obj._id] = tueren[obj._id];
                                    delete geschlosseneTueren[obj._id];
                                }    
                            }
                            
                            /*********************************************************************************************************
                             * *********************************** Ab hier bei Änderungen ********************************************
                            ******************************************************************************************************* */
                            
                            // Abfrage, ob sich ein Türzustand geändert hat
                            $(`state(${enumtypeFunctions}=${enumTuerInnen})`).on((dp)=>{
                                // Objekt holen und zuweisen
                                let obj = getObject(dp.id);
                                assignObject(obj,dp.state);
                            
                                // Arrays beschreiben
                                setState(idTueren,JSON.stringify(Object.values(tueren)),true);
                                setState(idOffeneTueren,JSON.stringify(Object.values(offeneTueren)),true);
                                setState(idGeschlosseneTueren,JSON.stringify(Object.values(geschlosseneTueren)),true);
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            895
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            4
                            22
                            859
                            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