Come creare una funzione ricorsiva con array associativo come parametroSto provando ad analizzare un array associativo nidificato in JMP 16 (estratto da un JSON). La struttura di base del JSON è la seguente:
{
"groupOp": "&",
"rules": [
{"column": "col1", "op": "==", "value": 1},
{
"groupOp": "|",
"rules": [
{"column": "col2", "op": "==", "value": 2}
{"column": "col3", "op": "==", "value": 3}
]
}
}Ciò consentirebbe l'archiviazione strutturata della condizione nidificata "col1 == 1 & (col2 == 2 | col3 == 3)" e di altre di profondità arbitraria.
Ho scritto una funzione ricorsiva per analizzare questa struttura, usando la funzione contains per distinguere il caso base dal caso ricorsivo. Tuttavia, sto riscontrando un errore di stack overflow. Dopo il debug, mi sono reso conto che mentre "rule" aveva il valore corretto, "obj" rimaneva lo stesso a ogni chiamata ricorsiva.
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 );
);
);Ha a che fare con la funzione For Each, con un array associativo come parametro, o con qualcos'altro?
Modellazione statistica avanzataRicerca sui consumatori e sul mercatoAccesso ai datiFusione e pulizia dei datiRe: Come creare una funzione ricorsiva con array associativo come parametroPenso che questo potrebbe essere ciò che stai cercando. Segue codice non testato...
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: Come creare una funzione ricorsiva con array associativo come parametroGrazie per il consiglio. Tuttavia, riscontro ancora lo stesso problema.
Re: Come creare una funzione ricorsiva con array associativo come parametroSenza studiare troppo a fondo, il primo cambiamento di cui probabilmente hai bisogno è di rendere str locale. Cambia
parseFilter = Function( {obj},
A
parseFilter = Function( {obj},{str},
Sembra un altro elenco di parametri, ma in realtà è un elenco di variabili locali alla funzione e a ogni chiamata ricorsiva della funzione.