关联数组和删除与默认值相同的键刚刚注意到新行为(对我来说),当使用 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")});
)
);