Assoziative Arrays und Entfernen von Schlüsseln mit gleichem Wert wie StandardwertIch habe gerade ein neues Verhalten bemerkt (für mich), dass bei Verwendung von Associative Arrays() und dem Schlüssel, den Sie haben, denselben Wert wie den Standardwert hat, der Schlüssel möglicherweise verschwindet. Ich habe dies bemerkt, weil ich Associative Array verwendet habe, um verschiedene Statusmeldungen zu sammeln (der Standardwert war auf 0 gesetzt) und dann dieses assoziative Array verwendet habe, um die Benutzeroberfläche nach dem Sammeln von Status zu erstellen.
Erstellen Sie assoziative Arrays hat folgenden Hinweis, also 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 Notiz 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 die Standardwerte in Associative Array (vorerst) aufgeben, damit ich in allen meinen Skripten das gleiche Verhalten haben und nur die Fehler behandeln kann, die durch Schlüssel verursacht werden, die nicht von gefunden werden Assoziatives Array.
Bearbeiten:
Ich würde es vorziehen, dass die Schlüssel überhaupt nicht entfernt werden, wenn sie den gleichen Wert wie der Standardwert haben. Dies ist höchstwahrscheinlich aus gutem Grund (Optimierungen?) so tief in JMP integriert, dass ich vermute, dass es nicht geändert wird
SkripterstellungBetreff: Assoziative Arrays und Entfernen von Schlüsseln mit gleichem Wert wie 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 nur +=1 verwenden würde, um Vorkommen zu zählen, also würde ich es nie sehen.
Verwenden Sie außerdem kein { }, [ ] oder [ => ] für einen Anfangswert. Es funktioniert nicht so, wie Sie es erwarten, obwohl es etwas Licht auf das Problem werfen kann (es ändert den Standardwert, ohne ein Element hinzuzufügen).
Für den Fall, dass sich dies zum Besseren ändert, würde ich aus Gründen der Zukunftssicherheit explizit <
Betreff: Assoziative Arrays und Entfernen von Schlüsseln mit gleichem Wert wie 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 sie es mit Standardwerten tun. wie in sie löschen Schlüssel, wenn sie den gleichen Wert wie der Standardwert haben. Auch warum es sich nicht so verhält immer? 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 besondere Inkonsistenz, die Sie hervorgehoben haben, 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 haben mir dieses Skript zur Verfügung gestellt (ich hatte dies bereits auf andere Weise geändert/gelöst, aber ich werde es auch teilen):
Unten ist eine leicht modifizierte Version Ihres Beispiels, die keinen Standardwert für das assoziative Array verwendet, sondern die Verwendung eines Schlüssels handhabt, der nicht im Array 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")});
)
);