Hallo,
Ich habe Probleme mit der Syntax für eine For Each-Schleife über mehrere assoziative Arrays.
Zum Beispiel:
q = ["q1"=>11, "q2"=>22, "q3"=>33];
w = ["w1"=>1111, "w2"=>2222, "w3"=>3333];
Für ein einzelnes Array, nur als Referenz:
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 valuesAnalog funktioniert es bis zu einem gewissen Grad über zwei Arrays hinweg:
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"};Dann weiter bohren:
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";Allerdings möchte ich auch Werte erhalten. Ich habe mehrere Varianten der Klammergruppierung ausprobiert, aber nichts hat funktioniert. Ausgehend von der Syntax eines einzelnen Arrays sollte dies am offensichtlichsten sein:
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 ))Ich habe RTFM- und RTFF-ED verwendet und konnte nichts finden.
Natürlich kann ich das machen:
For Each( { {a, b}, i }, Across( q, w ), show( i, a, b, q[a], w[b] ) );aber das ist nicht der Punkt. Es ist eine Frage der Eleganz.
Irgendwelche Ideen?
Danke für die Antwort. Wie bereits erwähnt, ist es nicht so, dass ich die Werte nicht einfach extrahieren könnte. Ich finde es einfach seltsam, dass es für ein einzelnes assoziatives Array auch möglich ist, die Werte mithilfe einer verschachtelten Liste zu referenzieren, jedoch nicht über mehrere Arrays hinweg.
https://www.jmp.com/support/help/en/17.2/#page/jmp/conditional-and-logical-functions.shtml?os=win&source=application#ww10169967
Wenn Sie mehrere Container mit dem Schlüsselwort Across() angeben, enthält die Namensliste eine Liste von Namen, die auf Werte in jedem Container verweisen. Die Anzahl der Namen im ersten Element der Namensliste muss mit der Anzahl der im Schlüsselwort Across() angegebenen Container übereinstimmen.
Und für assoziatives Array
Bei einem assoziativen Array- Container enthält die Namensliste eine aus zwei Elementen bestehende Namensliste und einen Namen für den Index jedes Elements im assoziativen Array.
Ich denke also, dass Sie sich für etwas entscheiden müssen, was Sie vorgeschlagen haben
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^"));
);
oder vielleicht so etwas (was sich auch etwas seltsam anfühlt)
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^"));
);
Möglicherweise gibt es eine Syntax, die verwendet werden sollte, aber ich habe keine Ahnung, wie das aussehen könnte, und ich stimme zu, dass so etwas höchstwahrscheinlich am offensichtlichsten wäre
For Each({{{key1, val1}, {key2, val2}}, i}, Across(aa1, aa2), Show(i, key1, val1, key2, val2));