Comment créer une fonction récursive avec un tableau associatif comme paramètreJ'essaie d'analyser un tableau associatif imbriqué dans JMP 16 (extrait d'un JSON). La structure de base du JSON est la suivante :
{
"groupOp": "&",
"rules": [
{"column": "col1", "op": "==", "value": 1},
{
"groupOp": "|",
"rules": [
{"column": "col2", "op": "==", "value": 2}
{"column": "col3", "op": "==", "value": 3}
]
}
}Cela permettrait un stockage structuré de la condition imbriquée « col1 == 1 & (col2 == 2 | col3 == 3) », et d'autres de profondeur arbitraire.
J'ai écrit une fonction récursive pour analyser cette structure, en utilisant la fonction contains pour distinguer le cas de base du cas récursif. Cependant, je rencontre une erreur de dépassement de pile. Lors du débogage, j'ai réalisé que si "rule" avait la valeur correcte, "obj" restait le même à chaque appel récursif.
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 );
);
);Est-ce que cela a quelque chose à voir avec la fonction For Each, ayant un tableau associatif comme paramètre, ou autre chose ?
Modélisation statistique avancéeÉtudes de marché et de consommationAccès aux donnéesFusion et nettoyage des donnéesRe: Comment créer une fonction récursive avec un tableau associatif comme paramètreJe pense que c'est peut-être ce que vous recherchez. Le code non testé suit...
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: Comment créer une fonction récursive avec un tableau associatif comme paramètreMerci pour l'astuce. Je rencontre toujours le même problème.
Re: Comment créer une fonction récursive avec un tableau associatif comme paramètreSans étudier trop en profondeur, le premier changement dont vous avez probablement besoin est de rendre str local.
parseFilter = Function( {obj},
à
parseFilter = Function( {obj},{str},
Cela ressemble à une autre liste de paramètres, mais il s'agit en fait d'une liste de variables locales à la fonction et à chaque appel récursif de la fonction.