>  기사  >  웹 프론트엔드  >  JavaScript를 사용한 JSON의 패턴 매칭(2부 - 구현)_javascript 기술

JavaScript를 사용한 JSON의 패턴 매칭(2부 - 구현)_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:23:08992검색
알림 및 캡처
알림 및 캡처를 구현하는 것은 너무 쉽습니다. 캡처로 전달된 핸들러만 저장한 다음 알림에서 일치하는 핸들러를 찾으면 됩니다.
코드 복사 코드는 다음과 같습니다.

var filterHandlerBundles = []
Dispatch.capture = function(pattern, handler) {
var filter = createFilter(pattern);
filterHandlerBundles.push({
"filter": filter,
"handler": handler
});
};
Dispatcher.notify = function(json) {
for (var i = 0; i < filterHandlerBundles.length; i ) {
if (filterHandlerBundles[i]. filter.apply (this, 인수)) {
filterHandlerBundles[i].handler(json);
}
}
}

이 코드의 논리 핵심은 createFilter 부분에 있습니다. 이 함수는 패턴을 설명하는 JSON을 JSON이 일치하는지 확인하는 함수로 변환하는 역할을 합니다.
연산자
우리는 수많은 알고리즘을 설계했는데 어떻게 구현하나요? 기억하세요. 우리는 대소문자를 바꾸고 싶지 않습니다. 따라서 우리는 연산자와 구현 간의 매핑을 저장하기 위해 연관 배열을 사용합니다.
코드 복사 코드는 다음과 같습니다.

var 연산자 = {}; Operators[" lt"] = function(testValue, value) {
return 인수.length == 2 && value
}
operators["lte"] = function(testValue, value; ) {
return 인수.length == 2 && value <= testValue;
}
operators["gt"] = function(testValue, value) {
return 인수.length == 2 && value > testValue;
operators["gte"] = function(testValue, value) {
return 인수.length == 2 && value >= testValue; ;


이렇게 하면 "$" 뒤에 연산자만 추출하면 해당 판단 함수를 바로 찾을 수 있습니다. 위의 4가지 연산자는 비교적 구현하기 쉽기 때문에 여기에는 예시로 포함시켰습니다.
더 어려운 함수는 eq입니다. 데이터 유형에 따라 특정 판단 방법을 선택해야 하기 때문입니다. 문자열, 숫자 및 부울의 경우 eq의 의미는 ==입니다. Array의 경우 eq의 의미는 해당 요소의 모든 요소가 eq이고 Object의 경우 순서가 일정하다는 것입니다. 조건이 충족되었으므로 각 하위 조건의 연산자 문자열을 추출한 다음 해당 연산자를 호출해야 합니다. 자세한 내용은 전체 코드를 참조하세요.
다른 연산자는 더 간단할 것입니다. 여기서는 실제 필요에 따라 이러한 연산자의 하위 집합이나 상위 집합을 사용할 수 있습니다.

in - 배열을 탐색하여 찾을 수 있는지 확인하세요. .적어도 하나의 eq.
all - 배열을 탐색하여 각 배열에 eq가 있는지 확인합니다.
ex - 값이 전달되면 하위 요소가 존재합니다.
re - 정규식을 사용하여 문자열이 일치하는지 확인합니다.
ld - 판단을 위해 함수를 직접 호출합니다.
글은 다 썼나요? 제대로 썼는지 모르겠나요? 이에 대해서는 다음 기사에서 논의할 것이므로 기본 연산자를 추가하는 것부터 시작해 보겠습니다.



코드 복사 코드는 다음과 같습니다. operators[""] = function(testValue , 값) {
if (testValue 인스턴스of Array) {
반환 연산자["in"].apply(this, 인수)
} else if (testValue 인스턴스of RegExp) {
반환 연산자[ "re" ].apply(this, 인수);
} else if(testValue 인스턴스of 함수) {
반환 연산자["ld"].apply(this, 인수)
} else {
return 연산자 ["eq"].apply(this, 인수);
}
};


기본 연산자가 필요한 이유는 무엇입니까? 이것은 실제로 바로 가기입니다. 대부분의 경우 우리에게 필요한 것은 eq 연산입니다. 연산자를 모든 곳에 작성하면 코드가 매우 복잡해지고 아름답지 않게 됩니다. 두 JSON을 비교해 보세요. 어느 것이 더 자연스럽다고 생각하시나요?


코드 복사 코드는 다음과 같습니다. Dispatcher.capture({
" status": 200,
"command": "message"
}, function(json) { /* 메시지 표시 */ });
Dispatcher.capture({
"status$eq" : 200,
"command$eq": "message"
}, function(json) { /* 메시지 표시 */ })


분명히 첫 번째가 더 직관적입니다. 따라서 기본 연산자가 필요하며, 연산자 문자열이 ""인 경우 기본 연산자를 통해 연산자를 선택합니다.
필터링할 패턴
마지막으로 연산자를 연결하고 필터를 생성해야 합니다. 이 작업 부분은 실제로 어렵지 않습니다. 기본 연산자를 호출하면 됩니다.
코드 복사 코드는 다음과 같습니다.

var createFilter = function(condition) {
return function(json) {
if (arguments.length > 0) {
반환 연산자[""](condition, json)
} else {
반환 연산자["" ](condition );
};
};

json 매개변수가 전달되지 않는다는 점을 고려해야 하는 이유는 무엇입니까? 다음 글에서 말씀드리겠습니다. 이렇게 하지 않아도 괜찮습니다. 단지 작은 문제일 뿐입니다.
연산자를 작성할 때 가장 중요한 것은 엄격함입니다. Dispatcher는 캡슐화된 구성 요소이기 때문에 운영자가 전혀 엄격하지 않으면 결함이 깊게 묻혀서 찾기가 어렵습니다. 따라서 우리가 논의할 다음 기사는 단위 테스트를 통해 Dispatcher의 견고성을 크게 향상시킬 수 있습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.