NEWS
Hilfe ;- Array anlegen oder Objekt im Objekt…?
-
Hi zusammen,
ich brauche einen kurzen Denkanstoss…
In Anlehnung an den Beispielen von Bluefox habe ich bisher folgendes gemacht:
context.global.fbVars = context.global.fbVars || {}; // wenn es das Objekt context.global.fbVars noch nicht gibt, wird dieses hier leer angelegt var callid = "callid."+msg.callid; // für das Objekt global.context.fbVars context.global.fbVars[callid+".callid"] = msg.callid; context.global.fbVars[callid+".calltype"] = msg.calltype; //...usw.
Damit bin ich, für meine Verhältnisse, schon recht weit gekommen.
Für verschiedene callids werden nun ein Haufen Variablen erzeugt:
context.global.fbVars.callid.1.callid; context.global.fbVars.callid.1.calltype; ...
Ergibt im Objekt:
{ "callid.1.callid": "1", "callid.1.date": "10.05.15 20:07:07", "callid.1.calltype": "DISCONNECT", ...
Nun komme ich mit der weiteren Verarbeitung nicht so richtig weiter.
Wahrscheinlich ist es besser, wenn die CallIDs als weitere Objekte hinter dem Hauptobjekt erzeugt werden (Array).
Es müsste also so aussehen:
"callid" : [ { "callid": "1", "date": "10.05.15 20:07:07", "calltype": "DISCONNECT", ...
Ich komme aber einfach nicht darauf, wie ich diese Struktur in Javascript erzeuge.
Das Thema Objekte/Arrays ist mir da noch zu fern.
Wie müsste das erste CODE-Kästchen dafür aussehen?
Hilfe
Ich muss zwar alles umbauen (sind schon ein paar Stunden Arbeit bisher). Ich fürchte aber, dass es nicht anders geht.
Woran ich in der bisherigen Struktur z.B. scheitere:
-
nur alle Infos zu einer Call ID als Objekt ausgeben
-
Zustände innerhalb des Arrays zählen (das bekomme ich wahrscheinlich aus so hin)
-
-
Hallo ruhr70,
das Thema Arrays bringt gleich eine Dimension mehr mit, das braucht etwas Training. Wenn der Groschen dann gefallen ist, erkennt man ein geniales System.
Ein Array legst du so an:
`var variablenname = [];[/code]` Du kannst auch gleich die Inhalte reinschreiben (hier mein Beispiel für die Erfassung der Fensterzustände) `~~[code]~~var status_zustand_rhs = ['geschlossen','gekippt','geöffnet']; /* ************************** * RHS Balkontür ************************** */ on("hm-rpc.0.GEQ0129543.1.STATE"/*Balkontür.STATE*/, function (data) { log('Balkontür (RHS) ' + status_zustand_rhs[data.newState.val], 'info'); });[/code]` Man zählt die Positionen im Array ab 0 aufwärts. Der RHS (Drehgriffkontakt) gibt die drei Positionen 0 bis 2 zurück, daher lässt sich jeder Fenster-Position leicht eine Array-Position zuordnen. Für die Fritzboxgeschichte brauchst du in der ersten Zeile (erster Anruf) nur eine genaue Reihenfolge, in der die Daten hintereinander gespeichert werden sollen, festzulegen: 0 Callid = 0 -x | 1 calltype | 2 ... | 3 .... `~~[code]~~var context.global.fbVars.call = []; // Array "call" angelegt[/code]` Danach werden für jeden Anruf weitere Zeilen zugefügt, die du mit einer weiteren eckigen Klammer abfragen kannst. Zuerst die Zeile, dann die Spalte context.global.fbVars.call[0][1] ist Calltype (2\. Postion) vom ersten Anruf (1.Zeile) context.global.fbVars.call[5][0] ist CallID vom 6\. Anruf Ich kann es hier nicht testen, aber du füllst das Array mit den Werten einfach durch ansprechen der Position. Hoffe, das hilft etwas. Gruß Pix[/code]
-
Hi Pix,
erst einmal ganz, ganz herzlichen Dank für die ausführliche Info!
Beim Lesen bin ich mir noch nicht ganz sicher, ob ich damit auch das hinbekomme, was mir vorschwebt.
Es hilft auf jeden Fall schon einmal, weiter zu probieren.
Ich möchte am Ende eine Struktur haben, wie z.B. Tankerkönig die Daten zurück liefert:
http://forum.iobroker.org/download/file … &mode=view
Das heisst ein "Item" je Call ID.
Die Werte darin sollen per, ja was eigentlich, Namen ("calltype": "DISCONNECT")identifiziert werden und nicht über ihre Position.
Mit so einer Struktur, wie sie Tankerkönig, Google Maps, OpenWeather, usw. zurück liefert, komme ich prima klar.
90% von dem, was ich erreichen will, hat mit der Vorgehensweise, wie ich sie oben beschrieben hatte, funktioniert (Anruferlisten, usw.).
Z.B. alle Variablen werden in einer Baumstruktur in den ioBroker Objekten angezeigt.
Nun brauche ich es doch anders.
Wenn ich nachher wieder an den Rechner kann, arbeite ich Deine Infos im Detail durch und schau mal, ob ich das in die Richtung gebogen bekomme, wie ich es mir vorstelle.
Danke Dir noch einmal. Klasse Infos!
VG,
Michael
-
so pix,
jetzt probier ich mal, ob ich Deine Tipps mit meinem Ziel überein kriege
Hab gerade viel Zeit verschwendet und einen Fehler gesucht. In Node-red eine Test Node angelegt und so blöd auf dem Bildschirm gesetzt, dass ich sie einfach übersehen habe. Die Test Node hat mir alles durcheinander gehauen (globale Objekte). :oops:
Jetzt geht es frisch ans Werk
Danke noch einmal!
-
.
die Struktur, die ich mir vorstelle habe ich jetzt:
msg.callid = slices[2]; var callid = msg.callid; msg.date = slices[0]; msg.calltype = slices[1]; context.global.fbVarsTest = context.global.fbVarsTest || {}; context.global.fbVarsTest.callid = context.global.fbVarsTest.callid || []; context.global.fbVarsTest.callid[msg.callid] = context.global.fbVarsTest.callid[msg.callid] || {}; // Werte je Call ID Objekt context.global.fbVarsTest.callid[callid].callid = msg.callid; context.global.fbVarsTest.callid[callid].date = msg.date; context.global.fbVarsTest.callid[callid].calltype = msg.calltype;
ergibt:
{ "callid": [ { "callid": "0", "date": "10.05.15 20:06:58", "calltype": "RING" }, { "callid": "1", "date": "10.05.15 20:07:07", "calltype": "DISCONNECT" } ]
jetzt schauen mir mal, ob mir das in der weiteren Verarbeitung einen Vorteil bringt.
Danke pix!
p.s.: wahrscheinlich kann mann das auch eleganter anlegen.
Die Variable callid kann ich mir sparen und dafür direkt msg.callid verwenden.
-
Willst du einen Array sortiert nach Nummern, oder sortiert nach Zeit haben?
-
Willst du einen Array sortiert nach Nummern, oder sortiert nach Zeit haben? `
Nach Nummern.Die Eindeutige Nummer ist die Call ID.
Scheint so, wie ich es oben gemacht habe, auch zu funktionieren.
Ich bin gestern nicht mehr dazu gekommen alles umzustellen. Werde ich jetzt machen.
Wenn als erstes eine Call ID mit 1 ankommt, wird davor ein Objekt mit null angelegt.
Kommt dann eine Call ID mit 0, wird das Objekt [0] gefüllt.
Da ich es noch nicht probiert habe, gehe ich davon aus, dass ich auf die Objekte wie folgt zugreifen kann:
context.global.fbVarsTest.callid[2].connectedNumber
Für den Wert Connected Number der dritten Call ID [2].
Die vorherige Vorgehensweise (ohne Array) hat soweit auch funktioniert. War aber (für mich) eine Sackgasse.
Ich möchte dann z.B. alle Call IDs durchgehen, und unter context.global.fbVarsTest.callid[2].calltype nachsehen, ob und wie viele Types mit "RING" dort aktiv sind.
Noch keine Ahnung, wie ich das mache. Stelle mir das aber einfacher vor, als den Haufen Variablen, den ich bisher habe.
-
Willst du einen Array sortiert nach Nummern, oder sortiert nach Zeit haben? `
Hi Bluefox,
das Array mit den Nummern (call ID) funktioniert prächtig
Jetzt will ich innerhalb des Objekts ein zweites Array anlegen.
Hier wäre eine Sortierung nach Zeit sinnvoll, am besten noch, mit dem aktuellsten Eintrag an erster Stelle.
Die Frage ist, ob das geht und wie man das dann handhabt.