Tableaux associatifs et suppression des clés avec la même valeur que la valeur par défautJe viens de remarquer un nouveau comportement (pour moi) selon lequel lorsque vous utilisez Associative Arrays() et que la clé que vous avez a la même valeur que la valeur par défaut, la clé peut disparaître. J'ai remarqué cela parce que j'utilisais Associative Array pour collecter différents messages d'état (la valeur par défaut était définie sur 0), puis j'ai utilisé ce tableau associatif pour créer une interface utilisateur après la collecte des statuts.
Créer des tableaux associatifs a la note suivante donc c'est le comportement attendu:
Noter: Si la valeur d'une clé est la valeur par défaut, la clé est supprimée car toute clé renverra la valeur par défaut.
Un exemple où cette note ne semble pas détenir la vérité :
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=> 0];
Des idées pourquoi cela fonctionne comme ça? En raison de ce comportement (les clés sont supprimées), je vais très probablement abandonner les valeurs par défaut dans Associative Array (pour l'instant) afin que je puisse avoir le même comportement dans tous mes scripts et gérer simplement les erreurs causées par les clés qui ne sont pas trouvées à partir du Tableau associatif.
Éditer:
Je préférerais que les clés ne soient pas supprimées du tout, lorsqu'elles ont la même valeur que la valeur par défaut. Ceci est probablement si profondément intégré à JMP pour une bonne raison (optimisations ?) que je soupçonne qu'il ne sera pas modifié
ScriptRe : Tableaux associatifs et suppression des clés avec la même valeur que la valeur par défautAucune idée. Ce n'est pas non plus le comportement auquel je m'attendais.
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
Mon utilisation normale est similaire, sauf que je n'utiliserais que +=1 pour compter les occurrences, donc je ne le verrais jamais.
N'utilisez pas non plus de { }, [ ] ou [ => ] comme valeur initiale. Cela ne fonctionne pas comme prévu, même si cela peut éclairer le problème (il modifie la valeur par défaut sans ajouter d'élément.)
Pour la pérennité, au cas où cela changerait pour le mieux, j'utiliserais explicite <
Re : Tableaux associatifs et suppression des clés avec la même valeur que la valeur par défautJ'ai obtenu pas mal de réponses à ce sujet de la part du support JMP, je vais essayer d'écrire une sorte de résumé de celles-ci.
Ma question à l'appui
Si possible, j'aimerais comprendre pourquoi les tableaux associatifs de JMP fonctionnent comme ils le font avec les valeurs par défaut, comme dans ils suppriment les clés si elles ont la même valeur que la valeur par défaut. Aussi pourquoi il ne se comporte pas comme ça toujours? J'ai posté à ce sujet sur la communauté https://community.jmp.com/t5/Discussions/Associative-arrays-and-removal-of-keys-with-value-same-as/td-p/461239
Script de test avec un comportement qui ne fonctionne pas comme prévu (à mon avis):
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=>0];
Résumé des réponses du support :
Je voulais juste partager avec vous la réponse que j'ai reçue de la R&D : ce comportement a été implémenté dans des tableaux associatifs dans le cadre de la modélisation d'ensembles et d'opérations d'ensemble avec la structure de données. L'incohérence particulière que vous avez soulignée sera corrigée dans une prochaine version (JMP-776).
Je leur ai également fourni un "exemple" qui était très proche de la situation dans laquelle j'ai remarqué le problème et ils m'ont fourni ce script (j'avais déjà modifié/résolu de cette autre manière, mais je vais également le partager):
Vous trouverez ci-dessous une version légèrement modifiée de votre exemple qui n'utilise pas de valeur par défaut pour le tableau associatif, mais gère l'utilisation d'une clé qui n'existe pas dans le tableau. Dans cet exemple, l'algorithme garantit que les icônes sont toujours alignées avec la description appropriée.
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")});
)
);