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 Associative Array per raccogliere diversi messaggi di stato (il valore predefinito era impostato su 0) e quindi ho utilizzato 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é funzioni 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 solo gli errori causati da 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
Automazione e scriptingMiscelazione e pulizia dei datiOggetto: array associativi e rimozione di chiavi con valore uguale a quello predefinitoHo ricevuto alcune risposte al riguardo dal supporto di JMP, cercherò di scrivere una sorta di riepilogo di queste.
La mia domanda da sostenere
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 test con 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 dell'assistenza:
Volevo solo condividere con voi la risposta che ho ricevuto dalla ricerca e sviluppo: questo comportamento è stato implementato negli array associativi come parte di insiemi di modellazione e operazioni sugli insiemi con la struttura dei dati. La particolare incoerenza evidenziata verrà risolta 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 garantisce 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")});
)
);
Oggetto: array associativi e rimozione di chiavi con valore uguale a quello predefinitoNessuna idea. Non è nemmeno il comportamento che mi sarei aspettato.
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 [ => ] come valore iniziale. Non funziona nel modo previsto, anche se potrebbe far luce sul problema (cambia il valore predefinito senza aggiungere un elemento).
Per essere a prova di futuro, nel caso in cui questo venga cambiato in meglio, userei esplicito <