Matrices asociativas y eliminación de claves con el mismo valor que el valor predeterminadoAcabo de notar un nuevo comportamiento (para mí) que cuando usas Associative Arrays() y la clave que tienes, tiene el mismo valor que el valor predeterminado, la clave podría desaparecer. Me di cuenta de esto porque estaba usando la matriz asociativa para recopilar diferentes mensajes de estado (el valor predeterminado se estableció en 0) y luego usé esa matriz asociativa para crear la interfaz de usuario después de recopilar los estados.
Crear matrices asociativas tiene la siguiente nota, por lo que este es el comportamiento esperado:
Nota: Si el valor de una clave es el valor predeterminado, la clave se descarta porque cualquier clave devolverá el valor predeterminado.
Un ejemplo en el que esa Nota no parece ser cierta:
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=> 0];
¿Alguna idea de por qué funciona así? Debido a este comportamiento (las claves se eliminan), lo más probable es que renuncie a los valores predeterminados en Associative Array (por ahora) para poder tener el mismo comportamiento en todos mis scripts y solo manejar los errores causados por las claves que no se encuentran en el matriz asociativa.
Editar:
Preferiría que las claves no se eliminen en absoluto, cuando tienen el mismo valor que el valor predeterminado. Es muy probable que esto esté tan profundamente integrado en JMP por alguna buena razón (¿optimizaciones?) Que sospecho que no se cambiará
secuencias de comandosRe: Matrices asociativas y eliminación de claves con el mismo valor que el valor predeterminadoNi idea. Tampoco es el comportamiento que esperaría.
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] -= aa["a"] ;
show(aa); // aa = ["a" => 0, => 0]; ! good ?
Mi uso normal es similar, excepto que solo usaría +=1 para contar las ocurrencias, por lo que nunca lo vería.
Además, no use { }, [ ] o [ => ] para un valor inicial. No funciona de la manera esperada, aunque puede arrojar algo de luz sobre el problema (cambia el valor predeterminado sin agregar un elemento).
Para el futuro, en caso de que esto cambie para mejor, usaría <
Re: Matrices asociativas y eliminación de claves con el mismo valor que el valor predeterminadoRecibí bastantes respuestas con respecto a esto del soporte de JMP, intentaré escribir algún tipo de resumen de ellas.
Mi pregunta para apoyar
Si es posible, me gustaría entender por qué las matrices asociativas de JMP funcionan como lo hacen con valores predeterminados, ya que eliminan claves si tienen el mismo valor que el valor predeterminado. También por qué no se comporta así. ¿siempre? He publicado sobre esto en la comunidad. https://community.jmp.com/t5/Discussions/Associative-arrays-and-removal-of-keys-with-value-same-as/td-p/461239
Script de prueba con un comportamiento que no funciona según lo previsto (en mi opinión):
Names Default To Here(1);
aa = [=> 0];
aa["a"] += 0;
show(aa); // aa = ["a" => 0, => 0];
aa["a"] = 0;
show(aa); // aa = [=>0];
Resumen de las respuestas del soporte:
Solo quería compartir con ustedes la respuesta que recibí de I+D: este comportamiento se implementó en matrices asociativas como parte del modelado de conjuntos y operaciones de conjuntos con la estructura de datos. La inconsistencia particular que resaltó se abordará en una versión futura (JMP-776).
También les proporcioné un "ejemplo" que estaba muy cerca de la situación en la que noté el problema y me proporcionaron este script (ya lo había modificado/resolvido de otra manera, pero lo compartiré también):
A continuación se muestra una versión ligeramente modificada de su ejemplo que no usa un valor predeterminado para la matriz asociativa, pero maneja el uso de una clave que no existe en la matriz. En este ejemplo, el algoritmo garantiza que los íconos siempre estén alineados con la descripción adecuada.
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")});
)
);