連想配列をパラメータとして再帰関数を作成する方法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 関数、パラメータとして連想配列を持つこと、あるいは他の何かに関係しているのでしょうか?
高度な統計モデリング消費者および市場調査データアクセスデータのブレンドとクリーンアップRe: 連想配列をパラメータとして再帰関数を作成する方法これがあなたが求めているものだと思います。テストされていないコードが続きます...
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: 連想配列をパラメータとして再帰関数を作成する方法アドバイスありがとうございます。しかし、まだ同じ問題が発生しています。
Re: 連想配列をパラメータとして再帰関数を作成する方法あまり深く調べなくても、おそらく最初に必要な変更はstrをローカルにすることです。変更
parseFilter = Function( {obj},
に
parseFilter = Function( {obj},{str},
これは別のパラメータ リストのように見えますが、実際には関数および関数の各再帰呼び出しに対してローカルな変数のリストです。