こんにちは、
複数の連想配列にわたる For Each ループの構文に苦労しています。
例えば:
q = ["q1"=>11, "q2"=>22, "q3"=>33];
w = ["w1"=>1111, "w2"=>2222, "w3"=>3333];
単一配列の場合、参考までに:
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 values同様に、2 つの配列全体でもある程度機能します。
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"};次に、さらにドリルします。
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";ただし、値も取得したいと考えています。中括弧のグループ化のいくつかのバリエーションを試してみましたが、何も機能しませんでした。単一の配列構文を基にすると、これが最も明白になります。
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 ))RTFM と RTFF を実行しましたが、何も見つかりませんでした。
もちろん、これもできます:
For Each( { {a, b}, i }, Across( q, w ), show( i, a, b, q[a], w[b] ) );しかし、これは重要ではありません。それは優雅さの問題です。
何か案は?
返信いただきありがとうございます。前述したように、値を簡単に抽出できないわけではありません。単一の連想配列の場合は、ネストされたリストを使用して値を参照することもできるのに、複数の配列にわたっては参照できないのは奇妙だと思います。
https://www.jmp.com/support/help/en/17.2/#page/jmp/conditional-and-logical-functions.shtml?os=win&source=application#ww10169967
Across()キーワードを使用して複数のコンテナーを指定する場合、名前リストには、各コンテナーの値を参照する名前のリストが含まれます。名前リストの最初の項目の名前の数は、Across()キーワードで指定されたコンテナの数と一致する必要があります。
そして連想配列の場合
連想配列コンテナーの場合、名前リストには、名前の 2 つの項目リストと、連想配列内の各項目のインデックスの名前が含まれます。
したがって、あなたが提案したようなものを使用する必要があると思います
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^"));
);
または、おそらく次のようなものです(これも少し奇妙に感じます)
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^"));
);
使用すべき構文があるかもしれませんが、それが何であるかはわかりません。おそらくこのような構文が最も明白であることに同意します。
For Each({{{key1, val1}, {key2, val2}}, i}, Across(aa1, aa2), Show(i, key1, val1, key2, val2));