關聯數組和刪除與默認值相同的鍵剛剛注意到新行為(對我來說),當使用 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 中,我懷疑它不會被改變
腳本回复:關聯數組和刪除與默認值相同的鍵不知道。 這也不是我所期望的行為。
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
我的正常用法是相似的,除了我只使用 +=1 來計算出現次數,所以我永遠不會看到它。
此外,不要使用 { }、[ ] 或 [ => ] 作為初始值。 它不會按您期望的方式工作,儘管它可能會解決這個問題(它會更改默認值而不添加元素。)
對於未來的證明,如果這變得更好,我會使用顯式 <
回复:關聯數組和刪除與默認值相同的鍵我確實從 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")});
)
);