連想配列とデフォルト値と同じ値を持つキーの削除Associative Arrays() を使用し、キーがデフォルト値と同じ値を持つ場合、キーが消える可能性があるという (私にとっての) 新しい動作に気づきました。 私がこれに気づいたのは、連想配列を使用してさまざまなステータス メッセージを収集し (デフォルト値は 0 に設定されていました)、ステータスを収集した後にその連想配列を使用してユーザー インターフェイスを構築したためです。
連想配列の作成次の注記があるため、これは予期された動作です。
注記:キーの値がデフォルト値の場合、どのキーもデフォルト値を返すため、そのキーは削除されます。
そのメモが真実ではないと思われる一例:
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: 連想配列とデフォルト値と同じ値を持つキーの削除これに関して 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")});
)
);
Re: 連想配列とデフォルト値と同じ値を持つキーの削除わかりません。 それは私が期待する動作でもありません。
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
私の通常の使用法も似ていますが、出現回数をカウントするために +=1 のみを使用するため、それを見ることはありません。
また、初期値に { }、[ ]、[ => ] を使用しないでください。 これは期待どおりには機能しませんが、問題をいくらか明らかにすることはできます (要素を追加せずにデフォルト値を変更します)。
将来を見据えて、これがより良い方向に変更された場合に備えて、それが必要な場合は明示的な <