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. [gelöst] Ersetzen eines json Array elements

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.8k

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

[gelöst] Ersetzen eines json Array elements

Geplant Angeheftet Gesperrt Verschoben JavaScript
22 Beiträge 4 Kommentatoren 939 Aufrufe 1 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.
  • Ben1983B Ben1983

    @ticaki ganz ehrlich ich Checks nicht, wo deine Variable

    a
    

    herkommt.
    die wird nirgends definiert.

    Ich habe es aktuell so gelöst, dass ich bei einer Änderung die Objekte vom selektor durchlaufe und die States zuweisen.
    Bin gerade nur am Handy, sonst würde ich grad mal den Code posten.

    T Nicht stören
    T Nicht stören
    ticaki
    schrieb am zuletzt editiert von ticaki
    #10

    @ben1983

    Dazu solltest du den Befehl nachschlagen. findIndex durchsucht das Array und ruft eine vorgegebene Funktion mit den Parameter (arrayItem, arrayIndex, array) auf und erwartet das die Funktion true oder false zurück gibt.

    var id = 'ne id'
    const index = arr.findIndex(arrayTest);
    
    function arrayTest(a) {
      if (a && a.Id === id) return true
      else return false;
    }
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

    das (a) => ... ist ne kürzere schreibweise. (und scope aber das juckt hier nicht)

    EDIT: ich weiß wie du das wahrscheinlich machst, hat bei mir auch etwas mit dem z.B. findIndex gedauert bis es da klick gemacht hat.

    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

    Spenden

    Ben1983B 1 Antwort Letzte Antwort
    0
    • T ticaki

      @ben1983

      Dazu solltest du den Befehl nachschlagen. findIndex durchsucht das Array und ruft eine vorgegebene Funktion mit den Parameter (arrayItem, arrayIndex, array) auf und erwartet das die Funktion true oder false zurück gibt.

      var id = 'ne id'
      const index = arr.findIndex(arrayTest);
      
      function arrayTest(a) {
        if (a && a.Id === id) return true
        else return false;
      }
      

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

      das (a) => ... ist ne kürzere schreibweise. (und scope aber das juckt hier nicht)

      EDIT: ich weiß wie du das wahrscheinlich machst, hat bei mir auch etwas mit dem z.B. findIndex gedauert bis es da klick gemacht hat.

      Ben1983B Offline
      Ben1983B Offline
      Ben1983
      schrieb am zuletzt editiert von Ben1983
      #11

      @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 Antwort Letzte Antwort
      0
      • Ben1983B 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 Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von ticaki
        #12

        @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 :D

        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.

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        Ben1983B 1 Antwort Letzte Antwort
        0
        • T 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 :D

          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.

          Ben1983B Offline
          Ben1983B Offline
          Ben1983
          schrieb am zuletzt editiert von Ben1983
          #13

          @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 Antwort Letzte Antwort
          0
          • Ben1983B 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 Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von ticaki
            #14

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

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            paul53P 1 Antwort Letzte Antwort
            0
            • T 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 :)

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

              @ticaki sagte: lesbarkeit geht vor effizenz!

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

              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

              T 1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @ticaki sagte: lesbarkeit geht vor effizenz!

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

                T Nicht stören
                T Nicht stören
                ticaki
                schrieb am zuletzt editiert von
                #16

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

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                paul53P 1 Antwort Letzte Antwort
                0
                • T ticaki

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

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

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

                  Nicht in Verbindung mit dem $Selector.

                  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

                  T 1 Antwort Letzte Antwort
                  0
                  • paul53P paul53

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

                    Nicht in Verbindung mit dem $Selector.

                    T Nicht stören
                    T Nicht stören
                    ticaki
                    schrieb am zuletzt editiert von ticaki
                    #18

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

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    Ben1983B 2 Antworten Letzte Antwort
                    0
                    • T 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.

                      Ben1983B Offline
                      Ben1983B Offline
                      Ben1983
                      schrieb am zuletzt editiert von
                      #19

                      @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 Antwort Letzte Antwort
                      0
                      • T 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.

                        Ben1983B Offline
                        Ben1983B Offline
                        Ben1983
                        schrieb am zuletzt editiert von
                        #20

                        @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 Antwort Letzte Antwort
                        0
                        • Ben1983B Ben1983

                          @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 Nicht stören
                          T Nicht stören
                          ticaki
                          schrieb am zuletzt editiert von ticaki
                          #21

                          @ben1983

                          Ich finde array für die Ausgabe am passenden.

                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                          Spenden

                          Ben1983B 1 Antwort Letzte Antwort
                          1
                          • T ticaki

                            @ben1983

                            Ich finde array für die Ausgabe am passenden.

                            Ben1983B Offline
                            Ben1983B Offline
                            Ben1983
                            schrieb am zuletzt editiert von Ben1983
                            #22

                            @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 Antwort Letzte Antwort
                            0
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            703

                            Online

                            32.6k

                            Benutzer

                            82.1k

                            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