关联数组和删除与默认值相同的键只是注意到新的行为(对我来说),当使用关联数组()并且您拥有的键具有与默认值相同的值时,键可能会消失。 我注意到这一点是因为我使用关联数组来收集不同的状态消息(默认值设置为 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 中,以至于我怀疑它不会改变
自动化和脚本编写数据混合和清理回复:关联数组和删除值与默认值相同的键我确实从 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];
支持人员的答复摘要:
我只是想与您分享我从研发部门收到的答案:这种行为是在关联数组中实现的,作为数据结构建模集和集合操作的一部分。 您强调的特定不一致问题将在未来版本 (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")});
)
);
回复:关联数组和删除值与默认值相同的键不知道。 这也不是我所期望的行为。
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
我的正常用法类似,只是我只使用 +=1 来计算出现次数,所以我永远不会看到它。
另外,请勿使用 { }、[ ] 或 [ => ] 作为初始值。 它不会按您期望的方式工作,尽管它可能会阐明该问题(它会更改默认值而不添加元素。)
为了面向未来,如果情况变得更好,我会使用显式 <