你好,
我正在努力解决跨多个关联数组的 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类似地,它在某种程度上适用于两个数组:
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-logic-functions.shtml?os=win&source=application#ww10169967
使用Across()关键字指定多个容器时,名称列表包含引用每个容器中的值的名称列表。名称列表中第一项的名称数量必须与Across()关键字中指定的容器数量相匹配。
对于关联数组
对于关联数组容器,名称列表包含两个项目的名称列表以及关联数组中每个项目的索引名称。
所以我认为你必须按照你的建议去做
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));