Assoziative Arrays und Entfernung von Schlüsseln mit dem gleichen Wert wie dem StandardwertIch habe gerade ein neues Verhalten bemerkt (für mich), dass der Schlüssel möglicherweise verschwindet, wenn Associative Arrays() verwendet wird und der Schlüssel, den Sie haben, denselben Wert wie den Standardwert hat. Das ist mir aufgefallen, weil ich ein assoziatives Array verwendet habe, um verschiedene Statusmeldungen zu sammeln (der Standardwert war auf 0 gesetzt) und dann dieses assoziative Array zum Erstellen einer Benutzeroberfläche nach dem Sammeln der Status verwendet habe.
Erstellen Sie assoziative Arrays Es gibt folgenden Hinweis, daher ist dies das erwartete Verhalten:
Notiz: Wenn der Wert eines Schlüssels der Standardwert ist, wird der Schlüssel gelöscht, da jeder Schlüssel den Standardwert zurückgibt.
Ein Beispiel, bei dem diese Anmerkung nicht der Wahrheit zu entsprechen scheint:
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=> 0];
Irgendwelche Ideen, warum es so funktioniert? Aufgrund dieses Verhaltens (Schlüssel werden gelöscht) werde ich höchstwahrscheinlich (vorerst) auf Standardwerte im Assoziativen Array verzichten, damit ich in allen meinen Skripten das gleiche Verhalten haben und nur die Fehler behandeln kann, die durch Schlüssel verursacht werden, die nicht im gefunden werden Assoziatives Array.
Bearbeiten:
Ich würde es vorziehen, wenn die Schlüssel überhaupt nicht entfernt würden, wenn sie denselben Wert wie den Standardwert haben. Dies ist höchstwahrscheinlich aus einem guten Grund (Optimierungen?) so tief in JMP integriert, dass ich vermute, dass es nicht geändert wird
Automatisierung und SkripterstellungDatenmischung und -bereinigungBetreff: Assoziative Arrays und Entfernen von Schlüsseln mit dem gleichen Wert wie dem StandardwertIch habe diesbezüglich einige Antworten vom JMP-Support erhalten. Ich werde versuchen, eine Art Zusammenfassung davon zu schreiben.
Meine Frage an den Support
Wenn möglich, würde ich gerne verstehen, warum die assoziativen Arrays von JMP so funktionieren wie mit Standardwerten. Sie löschen Schlüssel, wenn sie denselben Wert wie den Standardwert haben. Auch warum es sich nicht so verhält stets? Ich habe darüber in der Community gepostet https://community.jmp.com/t5/Discussions/Associative-arrays-and-removal-of-keys-with-value-same-as/td-p/461239
Testskript mit Verhalten, das (meiner Meinung nach) nicht wie beabsichtigt funktioniert:
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=>0];
Zusammenfassung der Antworten vom Support:
Ich wollte Ihnen nur die Antwort mitteilen, die ich von R&D erhalten habe: Dieses Verhalten wurde in assoziativen Arrays als Teil der Modellierung von Mengen und Mengenoperationen mit der Datenstruktur implementiert. Die von Ihnen hervorgehobene besondere Inkonsistenz wird in einer zukünftigen Version (JMP-776) behoben.
Ich habe ihnen auch ein „Beispiel“ zur Verfügung gestellt, das der Situation, in der ich das Problem bemerkte, sehr nahe kam, und sie stellten mir dieses Skript zur Verfügung (ich hatte dies bereits auf andere Weise geändert/gelöst, aber ich werde es auch teilen):
Unten sehen Sie eine leicht modifizierte Version Ihres Beispiels, die keinen Standardwert für das assoziative Array verwendet, sondern die Verwendung eines Schlüssels verarbeitet, der im Array nicht vorhanden ist. In diesem Beispiel stellt der Algorithmus sicher, dass die Symbole immer an der richtigen Beschreibung ausgerichtet sind.
Names Default To Here(1);
//init aa
aa_status = Associative Array();
aa_status["Connection Check"] = "0";
aa_status["Folder found"] = "";
aa_status["To Delete"] = "1";
New Window("test",
Table Box(
des_ref = String Col Box("Description", aa_status << get keys),
cb_ref = Col Box("Status", {}),
)
);
//aa_status["Folder found"] = "0";
aa_status << Remove Item("To Delete");
For Each({val}, des_ref << Get,
If(Try(aa_status[val] == "0", 1),
cb_ref << Set({Icon Box("Excluded")});
,
cb_ref << Set({Icon Box("CheckCircle")});
)
);
Betreff: Assoziative Arrays und Entfernen von Schlüsseln mit dem gleichen Wert wie dem StandardwertKeine Ahnung. Es ist auch nicht das Verhalten, das ich erwarten würde.
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
Meine normale Verwendung ist ähnlich, außer dass ich +=1 nur zum Zählen von Vorkommen verwende, sodass ich es nie sehe.
Verwenden Sie außerdem kein { }, [ ] oder [ => ] als Anfangswert. Es funktioniert nicht wie erwartet, bringt aber möglicherweise Licht ins Dunkel (der Standardwert wird geändert, ohne dass ein Element hinzugefügt wird).
Zur Zukunftssicherheit würde ich für den Fall, dass sich dies zum Besseren ändert, explizites <