NEWS
[gelöst] Ersetzen eines json Array elements
-
@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.
-
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
-
@ticaki sagte: lesbarkeit geht vor effizenz!
Funktionen, die man nur sehr selten verwendet - man also nachschlagen muss, erhöhen nicht die Lesbarkeit.
-
@paul53
Naja .each ist wohl deutlich exotischer als array.filter() -
@ticaki sagte: .each ist wohl deutlich exotischer als array.filter()
Nicht in Verbindung mit dem $Selector.
-
@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.
-
@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
-
@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? -
Ich finde array für die Ausgabe am passenden.
-
@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); });