So erstellen Sie eine rekursive Funktion mit einem assoziativen Array als ParameterIch versuche, ein verschachteltes assoziatives Array in JMP 16 zu analysieren (extrahiert aus einem JSON). Die Grundstruktur des JSON ist wie folgt:
{
"groupOp": "&",
"rules": [
{"column": "col1", "op": "==", "value": 1},
{
"groupOp": "|",
"rules": [
{"column": "col2", "op": "==", "value": 2}
{"column": "col3", "op": "==", "value": 3}
]
}
}Dies würde eine strukturierte Speicherung der verschachtelten Bedingungen „col1 == 1 & (col2 == 2 | col3 == 3)“ und anderer Bedingungen mit beliebiger Tiefe ermöglichen.
Ich habe eine rekursive Funktion geschrieben, um diese Struktur zu analysieren, und dabei die Funktion „contains“ verwendet, um den Basisfall vom rekursiven Fall zu unterscheiden. Allerdings tritt dabei ein Stapelüberlauffehler auf. Beim Debuggen habe ich festgestellt, dass „rule“ zwar den richtigen Wert hatte, „obj“ jedoch bei jedem rekursiven Aufruf gleich blieb.
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 );
);
);Hat dies mit der For Each-Funktion zu tun, mit einem assoziativen Array als Parameter oder mit etwas anderem?
Erweiterte statistische ModellierungKonsumenten- und MarktforschungDatenzugriffDatenzusammenführung und -bereinigungBetreff: So erstellen Sie eine rekursive Funktion mit einem assoziativen Array als ParameterIch denke, das könnte das sein, wonach Sie suchen. Es folgt ungetesteter Code ...
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))
Betreff: So erstellen Sie eine rekursive Funktion mit einem assoziativen Array als ParameterDanke für den Tipp. Allerdings besteht immer noch das gleiche Problem.
Betreff: So erstellen Sie eine rekursive Funktion mit einem assoziativen Array als ParameterOhne zu sehr ins Detail zu gehen, ist die erste Änderung, die Sie wahrscheinlich vornehmen müssen , str lokal zu machen. Ändern
parseFilter = Function( {obj},
Zu
parseFilter = Function( {obj},{str},
Es sieht wie eine weitere Parameterliste aus, ist aber tatsächlich eine Liste von Variablen, die für die Funktion und für jeden rekursiven Aufruf der Funktion lokal sind.