CIAO,
Ho difficoltà con la sintassi di un ciclo For Each su più array associativi.
Per esempio:
q = ["q1"=>11, "q2"=>22, "q3"=>33];
w = ["w1"=>1111, "w2"=>2222, "w3"=>3333];
Per array singolo, solo per riferimento:
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 valuesAnalogamente, su due array funziona in una certa misura:
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"};Quindi perforando ulteriormente:
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";Tuttavia, voglio ottenere anche dei valori. Ho provato diverse varianti di raggruppamenti di parentesi graffe e niente funziona. Prendendo spunto dalla sintassi dell'array singolo, questa dovrebbe essere la più ovvia:
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 ))Ho effettuato RTFM e RTFF e non sono riuscito a trovare nulla.
Certo che posso farlo:
For Each( { {a, b}, i }, Across( q, w ), show( i, a, b, q[a], w[b] ) );ma questo non è il punto. È una questione di eleganza.
Qualche idea?
Grazie per la risposta. Come accennato, non è che non riesca a estrarre facilmente i valori. Trovo strano che per un singolo array associativo sia anche possibile fare riferimento ai valori utilizzando un elenco annidato, ma non su più array.
https://www.jmp.com/support/help/en/17.2/#page/jmp/conditional-and-logical-functions.shtml?os=win&source=application#ww10169967
Quando si specificano più contenitori utilizzando la parola chiave Across() , l'elenco dei nomi contiene un elenco di nomi che fanno riferimento ai valori in ciascun contenitore. Il numero di nomi nel primo elemento nell'elenco dei nomi deve corrispondere al numero di contenitori specificati nella parola chiave Across() .
E per l'array associativo
Per un contenitore di array associativo , l'elenco dei nomi contiene un elenco di nomi di due elementi e un nome per l'indice di ciascun elemento nell'array associativo.
Quindi penso che tu debba seguire qualcosa come hai suggerito
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 forse qualcosa del genere (che sembra anche un po' strano)
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^"));
);
Potrebbe esserci qualche sintassi da usare, ma non ho idea di cosa potrebbe essere e sono d'accordo che qualcosa del genere sarebbe molto probabilmente quello più ovvio
For Each({{{key1, val1}, {key2, val2}}, i}, Across(aa1, aa2), Show(i, key1, val1, key2, val2));