連想配列とデフォルト値と同じ値のキーの削除連想配列()とあなたが持っているキーを使用すると、デフォルト値と同じ値を持つという新しい振る舞い(私にとって)に気づきました。キーが消える可能性があります。 これに気付いたのは、連想配列を使用してさまざまなステータスメッセージを収集し(デフォルト値は0に設定)、ステータスを収集した後、その連想配列を使用してユーザーインターフェイスを構築したためです。
連想配列を作成する次の注記があるため、これは予想される動作です。
ノート:キーの値がデフォルト値の場合、どのキーもデフォルト値を返すため、キーはドロップされます。
そのメモが真実を保持していないように見える1つの例:
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=> 0];
なぜそれがこのように機能するのか、何か考えはありますか? この動作(キーが削除される)のため、連想配列のデフォルト値をあきらめる可能性が高いので(今のところ)、すべてのスクリプトで同じ動作をし、キーから発生したエラーを処理することができます。連想配列。
編集:
キーの値がデフォルト値と同じである場合は、キーがまったく削除されないようにすることをお勧めします。 これは、何らかの理由(最適化?)でJMPに深く組み込まれている可能性が高いため、変更されないと思います。
スクリプティングRe:連想配列とデフォルト値と同じ値のキーの削除わからない。 それは私が期待する振る舞いでもありません。
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
私の通常の使用法は似ていますが、発生をカウントするために+ = 1しか使用しないため、表示されません。
また、初期値に{}、[]、または[=>]を使用しないでください。 問題に光を当てる可能性はありますが、期待どおりに機能しません(要素を追加せずにデフォルト値を変更します)。
将来を保証するために、これが改善された場合に備えて、明示的な<< remove( "a")を使用します。デフォルト値を変更する場合は、明示的な<< remove( "a")を使用します。 getDefaultおよび<< setDefault。
Re:連想配列とデフォルト値と同じ値のキーの削除私はこれに関してJMPサポートからかなりの数の回答を得ました、私はそれらのある種の要約を書こうとします。
サポートする私の質問
可能であれば、JMPの連想配列がデフォルト値と同じように機能する理由を理解したいと思います。それらがデフォルト値と同じ値を持っている場合、それらはキーを削除します。 また、なぜそれがこのように動作しないのかいつも? これについてコミュニティに投稿しましたhttps://community.jmp.com/t5/Discussions/Associative-arrays-and-removal-of-keys-with-value-same-as/td-p/461239
(私の意見では)意図したとおりに機能しない動作でスクリプトをテストします。
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=>0];
サポートからの回答の要約:
R&Dから受け取った回答を皆さんと共有したいと思います。この動作は、データ構造を使用したモデリングセットおよびセット操作の一部として連想配列に実装されました。 強調した特定の不整合は、将来のリリース(JMP-776)で対処される予定です。
また、問題に気付いた状況に非常に近い「例」を提供し、このスクリプトを提供してくれました(私はすでにこれを別の方法で変更/解決しましたが、これも共有します)。
以下は、連想配列のデフォルト値を使用しないが、配列に存在しないキーを使用して処理する、わずかに変更されたバージョンの例です。 この例では、アルゴリズムにより、アイコンが常に適切な説明に揃えられます。
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")});
)
);