Cómo crear una función recursiva con una matriz asociativa como parámetroEstoy intentando analizar una matriz asociativa anidada en JMP 16 (extraída de un JSON). La estructura básica del JSON es la siguiente:
{
"groupOp": "&",
"rules": [
{"column": "col1", "op": "==", "value": 1},
{
"groupOp": "|",
"rules": [
{"column": "col2", "op": "==", "value": 2}
{"column": "col3", "op": "==", "value": 3}
]
}
}Esto permitiría el almacenamiento estructurado de la condición anidada "col1 == 1 & (col2 == 2 | col3 == 3)", y otras de profundidad arbitraria.
Escribí una función recursiva para analizar esta estructura, utilizando la función contains para distinguir el caso base del caso recursivo. Sin embargo, me encuentro con un error de desbordamiento de pila. Al depurar, me di cuenta de que, si bien "rule" tenía el valor correcto, "obj" permanecía igual en cada llamada recursiva.
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 );
);
);¿Tiene esto que ver con la función For Each, que tiene una matriz asociativa como parámetro, o con algo más?
Modelado estadístico avanzadoInvestigación de mercado y consumoAcceso a datosCombinación y limpieza de datosRe: Cómo crear una función recursiva con una matriz asociativa como parámetroCreo que esto podría ser lo que buscas. A continuación, se incluye un código no probado...
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))
Re: Cómo crear una función recursiva con una matriz asociativa como parámetroGracias por el consejo. Sigo teniendo el mismo problema.
Re: Cómo crear una función recursiva con una matriz asociativa como parámetroSin profundizar demasiado, el primer cambio que probablemente necesites es hacer que str sea local. Cambiar
parseFilter = Function( {obj},
a
parseFilter = Function( {obj},{str},
Parece otra lista de parámetros, pero en realidad es una lista de variables que son locales a la función y a cada llamada recursiva de la función.