Array associativi e rimozione di chiavi con valore uguale al valore predefinitoHo appena notato un nuovo comportamento (per me) che quando si utilizza Associative Arrays() e la chiave che hai, ha lo stesso valore del valore predefinito, la chiave potrebbe scomparire. L'ho notato perché stavo usando l'array associativo per raccogliere diversi messaggi di stato (il valore predefinito era impostato su 0) e quindi utilizzavo quell'array associativo per creare l'interfaccia utente dopo aver raccolto gli stati.
Crea array associativi ha la seguente nota, quindi questo è il comportamento previsto:
Nota: Se il valore di una chiave è il valore predefinito, la chiave viene eliminata perché qualsiasi chiave restituirà il valore predefinito.
Un esempio in cui quella nota non sembra contenere la verità:
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=> 0];
Qualche idea sul perché funziona così? A causa di questo comportamento (le chiavi vengono eliminate) molto probabilmente rinuncerò ai valori predefiniti in Associative Array (per ora) così posso avere lo stesso comportamento in tutti i miei script e gestire semplicemente gli errori causati dalle chiavi che non vengono trovate dal Matrice associativa.
Modificare:
Preferirei che le chiavi non venissero affatto rimosse, quando hanno lo stesso valore del valore predefinito. Molto probabilmente questo è così profondamente integrato in JMP per qualche buona ragione (ottimizzazioni?) che sospetto che non verrà modificato
SceneggiaturaRe: Array associativi e rimozione di chiavi con valore uguale al valore predefinitoNessuna idea. Non è nemmeno il comportamento che mi aspetterei.
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
Il mio utilizzo normale è simile, tranne per il fatto che userei solo +=1 per contare le occorrenze, quindi non lo vedrei mai.
Inoltre, non utilizzare { }, [ ] o [ => ] per un valore iniziale. Non funziona nel modo previsto, anche se potrebbe far luce sul problema (cambia il valore predefinito senza aggiungere un elemento).
A prova di futuro, nel caso in cui questo venga modificato in meglio, userei esplicito <
Re: Array associativi e rimozione di chiavi con valore uguale al valore predefinitoHo ricevuto alcune risposte al riguardo dal supporto JMP, proverò a scrivere una sorta di riepilogo di quelle.
La mia domanda al supporto
Se possibile, vorrei capire perché gli array associativi di JMP funzionano come fanno con i valori predefiniti, come in eliminano le chiavi se hanno lo stesso valore del valore predefinito. Anche perché non si comporta così sempre? Ho postato su questo alla comunità https://community.jmp.com/t5/Discussions/Associative-arrays-and-removal-of-keys-with-value-same-as/td-p/461239
Script di prova con un comportamento che non funziona come previsto (secondo me):
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=>0];
Riepilogo delle risposte del supporto:
Volevo solo condividere con voi la risposta che ho ricevuto da R&D: questo comportamento è stato implementato negli array associativi come parte di insiemi di modelli e operazioni di insiemi con la struttura dati. La particolare incoerenza che hai evidenziato verrà affrontata in una versione futura (JMP-776).
Ho anche fornito loro un "esempio" che era molto vicino alla situazione in cui ho notato il problema e mi hanno fornito questo script (avevo già modificato/risolto in questo altro modo, ma condividerò anche questo):
Di seguito è riportata una versione leggermente modificata del tuo esempio che non utilizza un valore predefinito per l'array associativo, ma gestisce utilizzando una chiave che non esiste nell'array. In questo esempio, l'algoritmo assicura che le icone siano sempre allineate con la descrizione corretta.
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")});
)
);