Hola,
Estoy luchando con la sintaxis de un bucle For Each en múltiples matrices asociativas.
Por ejemplo:
q = ["q1"=>11, "q2"=>22, "q3"=>33];
w = ["w1"=>1111, "w2"=>2222, "w3"=>3333];
Para una sola matriz, solo como referencia:
For Each( {a, i}, q, Show( i, a ) ); // retrieves indices and keys
For Each( { {a, b}, i }, q, Show( i, a, b ) ); // retrieves indices, keys and valuesDe manera análoga, en dos matrices funciona hasta cierto punto:
For Each( {a, i}, Across( q, w ), show( i, a ) );<BR />// retrieves indices and two-item lists of keys of both arrays:
i = 1;
a = {"q1", "w1"};
i = 2;
a = {"q2", "w2"};
i = 3;
a = {"q3", "w3"};Luego perforando más:
For Each( { {a, b}, i }, Across( q, w ), show( i, a, b ) );<BR />// retrieves indices and keys of both arrays separately:
i = 1;
a = "q1";
b = "w1";
i = 2;
a = "q2";
b = "w2";
i = 3;
a = "q3";
b = "w3";Sin embargo, también quiero obtener valores. Probé varias variantes de agrupaciones de llaves y nada funciona. A partir de la sintaxis de matriz única, esta debería ser la más obvia:
For Each( { { {a, b}, {c, d} }, i }, Across( q, w ), show( i, a, b, c, d ) );<BR />// returns error:<BR />argument value is invalid in access or evaluation of 'For Each' , Bad Argument( {a, b} ), For Each/*###*/({{{a, b}, <BR />{c, d}}, i}, Across( q, w ), Show( i, a, b, c, d ))Edité RTFM y RTFF y no pude encontrar nada.
Por supuesto que puedo hacer esto:
For Each( { {a, b}, i }, Across( q, w ), show( i, a, b, q[a], w[b] ) );Pero este no es el punto. Es una cuestión de elegancia.
¿Algunas ideas?
Gracias por la respuesta. Como se mencionó, no es que no pueda extraer los valores fácilmente. Me parece extraño que para una única matriz asociativa también sea posible hacer referencia a los valores utilizando una lista anidada, pero no en varias matrices.
https://www.jmp.com/support/help/en/17.2/#page/jmp/conditional-and-logic-functions.shtml?os=win&source=application#ww10169967
Al especificar varios contenedores utilizando la palabra clave Across() , la lista de nombres contiene una lista de nombres que hacen referencia a valores en cada contenedor. La cantidad de nombres en el primer elemento de la lista de nombres debe coincidir con la cantidad de contenedores especificados en la palabra clave Across() .
Y para matriz asociativa
Para un contenedor de matriz asociativa , la lista de nombres contiene una lista de nombres de dos elementos y un nombre para el índice de cada elemento de la matriz asociativa.
Así que creo que tienes que optar por algo como lo que sugeriste.
Names Default To Here(1);
aa1 = ["q1" => 11, "q2" => 22, "q3" => 33];
aa2 = ["w1" => 1111, "w2" => 2222, "w3" => 3333];
For Each({{key1, key2}, i}, Across(aa1, aa2),
val1 = aa1[key1];
val2 = aa2[key2];
Print(Eval Insert("\!Ni = ^i^"));
Print(Eval Insert("key1 = ^key1^, val1 = ^val1^"));
Print(Eval Insert("key2 = ^key2^, val2 = ^val2^"));
);
o tal vez algo como esto (que también se siente un poco raro)
Names Default To Here(1);
aa1 = ["q1" => 11, "q2" => 22, "q3" => 33];
aa2 = ["w1" => 1111, "w2" => 2222, "w3" => 3333];
For Each({{key1, key2, val1, val2}, i}, Across(aa1, aa2, aa1 << get values, aa2 << get values),
Print(Eval Insert("\!Ni = ^i^"));
Print(Eval Insert("key1 = ^key1^, val1 = ^val1^"));
Print(Eval Insert("key2 = ^key2^, val2 = ^val2^"));
);
Es posible que deba usarse alguna sintaxis, pero no tengo idea de cuál podría ser y estoy de acuerdo en que algo como esto probablemente sería la más obvia.
For Each({{{key1, val1}, {key2, val2}}, i}, Across(aa1, aa2), Show(i, key1, val1, key2, val2));