연관 배열을 매개변수로 하는 재귀 함수를 만드는 방법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)" 및 임의의 깊이에 대한 다른 조건을 구조적으로 저장할 수 있습니다.
저는 이 구조를 파싱하기 위해 재귀 함수를 작성했고, 포함 함수를 사용하여 기본 케이스와 재귀 케이스를 구분했습니다. 하지만 스택 오버플로 오류가 발생했습니다. 디버깅을 하다가 "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},
다른 매개변수 목록처럼 보이지만 실제로는 함수 자체에 로컬한 변수의 목록이며 함수의 각 재귀 호출에 대한 것입니다.