如何创建以关联数组为参数的递归函数我正在尝试解析 JMP 16 中的嵌套关联数组(从 JSON 中提取)。JSON 的基本结构如下:
{
"groupOp": "&",
"rules": [
{"column": "col1", "op": "==", "value": 1},
{
"groupOp": "|",
"rules": [
{"column": "col2", "op": "==", "value": 2}
{"column": "col3", "op": "==", "value": 3}
]
}
}这将允许结构化存储嵌套条件“col1 == 1 & (col2 == 2 | col3 == 3)”以及任意深度的其他条件。
我编写了一个递归函数来解析此结构,并使用 contains 函数来区分基本情况和递归情况。但是,我遇到了堆栈溢出错误。调试后,我意识到虽然“rule”具有正确的值,但“obj”在每次递归调用中都保持不变。
parseFilter = Function( {obj},
If (obj << contains("groupOp") & obj << contains("rules"),
str = "(";
For Each({rule}, obj["rules"],
show(rule);
Concat(str, Recurse(rule) || " " || groupOp || " ");
);
Concat(str, ")");
Return(str);
, // else
Return(":" || obj["column"] || " " || obj["op"] || " " || data );
);
);这是否与 For Each 函数有关,是否具有关联数组作为参数,或者其他什么?
高级统计建模消费者和市场研究数据访问数据混合和清理回复:如何使用关联数组作为参数创建递归函数我想这可能就是你想要的。以下是未经测试的代码...
json =
"\[
{
"groupOp": "&",
"rules": [
{"column": "col1", "op": "==", "value": 1},
{
"groupOp": "|",
"rules": [
{"column": "col2", "op": "==", "value": 2},
{"column": "col3", "op": "==", "value": 3}
]
}
]
}
]\";
parseFilter = Function( {obj},
{str, first},
If( obj << Contains( "groupOp" ) & obj << Contains( "rules" ),
str = "(";
first = 1;
For Each( {rule}, obj["rules"],
If( first,
first = 0;
,// else
str ||= (" " || obj["groupOp"] || " ")
);
str ||= Recurse( rule );
);
str ||= ")";
Return( str );
, // else
Return( ":" || obj["column"] || " " || obj["op"] || " " || Char( obj["value"] ) )
)
);
Write( parsefilter( Parse JSON( json ) ) );
(:col1 == 1 & (:col2 == 2 | :col3 == 3))
回复:如何使用关联数组作为参数创建递归函数谢谢你的提示。不过还是遇到了同样的问题。
回复:如何使用关联数组作为参数创建递归函数无需深入研究,你可能需要的第一个更改是将str设为本地的。更改
parseFilter = Function( {obj},
到
parseFilter = Function( {obj},{str},
它看起来像另一个参数列表,但它实际上是函数局部变量的列表,以及函数的每个递归调用的变量列表。