如何建立以關聯數組為參數的遞歸函數我正在嘗試解析 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},
它看起來像另一個參數列表,但實際上是函數以及函數的每個遞歸呼叫的本地變數列表。