ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript を使用した JSON のパターン マッチング (パート 2 - 実装)_JavaScript スキル

JavaScript を使用した JSON のパターン マッチング (パート 2 - 実装)_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 18:23:081024ブラウズ
通知とキャプチャ
通知とキャプチャの実装は非常に簡単です。キャプチャによって渡されたハンドラを保存し、通知で一致するハンドラを見つけるだけです。
コードをコピーします コードは次のとおりです。

var filterHandlerBundles = []
; Dispatch.capture = function(pattern, handler) {
var filter = createFilter(pattern);
filterHandlerBundles.push({
"filter": フィルター,
"handler": ハンドラー
});
};
Dispatcher.notify = function(json) {
for (var i = 0; i if (filterHandlerBundles[i]. filter.apply (this, argument)) {
filterHandlerBundles[i].handler(json);
}
}
}; このコードのロジック重要なのは createFilter 部分にあります。この関数は、パターンを記述する JSON を、JSON が一致するかどうかを判断する関数に変換する役割を果たします。
演算子

私たちはたくさんのアルゴリズムを設計しましたが、それらをどのように実装すればよいでしょうか?大文字と小文字を切り替えたくないことに注意してください。したがって、演算子と実装の間のマッピングを保存するために連想配列を使用します。

}
operators["gt"] = function(testValue, value) {
return argument.length == 2 && 値 > testValue;
operators["gte"] = function(testValue, value) {
return argument.length == 2 && value >= testValue; ;


このように、「$」以降の演算子を抽出すれば、対応する判定関数がすぐに見つかります。上記の 4 つは比較演算子であり、実装が比較的簡単であるため、ここでは例として示します。
より難しい関数は eq です。これは、データ型に基づいて特定の判定方法を選択する必要があるためです。文字列、数値、およびブール値の場合、eq の意味は == であり、配列の場合、eq の意味はその中のすべての要素が eq であること、オブジェクトの場合、eq の意味はすべてのサブ要素であることです。条件が満たされるため、各サブ条件の演算子文字列を抽出し、対応する演算子を呼び出す必要があります。詳細については、完全なコードを参照してください。
他の演算子はより単純です。ここではヒントだけを示します。実際のニーズに応じてこれらの演算子のサブセットまたはスーパーセットを使用できます。

in - 配列を走査して、それが見つかるかどうかを確認します。少なくとも 1 つの等量。
all - 配列を走査して、それぞれに eq が存在するかどうかを確認します。
ex - 値が渡された場合、子要素が存在します。
re - 正規表現を使用して、文字列が一致するかどうかを判断します。
ld - 判定用の関数を直接呼び出します。
もう書き終わりましたか?正しく書いたかどうかわかりませんか?これについては次の記事で説明するので、デフォルトの演算子を追加することから始めましょう。




コードをコピー


コードは次のとおりです。


operators[""] = function(testValue 、値) {
if (testValue 配列のインスタンス) { 戻り演算子["in"].apply(this, argument); } else if (testValue インスタンスの RegExp) { 戻り演算子[ "re" ].apply(this, argument); } else if (testValue 関数のインスタンス) { return 演算子["ld"].apply(this, argument); } >return 演算子 ["eq"].apply(this, argument);
}
}; なぜデフォルトの演算子が必要なのでしょうか?これは実際には単なるショートカットです。ほとんどの場合、必要なのは eq 演算です。演算子をあらゆる場所に記述すると、コードは非常に複雑になり、美しくなくなります。 2 つの JSON を比較して、どちらがより自然だと思いますか?




コードをコピー


コードは次のとおりです:


Dispatcher.capture({
" status": 200,
"command": "メッセージ"
}, function(json) { /* メッセージの表示 */ });
Dispatcher.capture({
"status$eq" : 200, "command$eq": "メッセージ" }, function(json) { /* メッセージを表示 */ });
明らかに、最初の方が直感的です。したがって、デフォルトの演算子が必要であり、演算子文字列が "" の場合は、デフォルトの演算子を介して演算子を選択します。
フィルターへのパターン
最後に、演算子を接続してフィルターを作成する必要があります。この部分の作業は実際には難しくなく、デフォルトのオペレータを呼び出すだけです。
コードをコピー コードは次のとおりです。

var createFilter = function(condition) {
return function(json) {
if (arguments.length > 0) {
return 演算子[""](条件, json);
} else {
return 演算子["" ](条件 );
}
};

なぜ json パラメータが渡されないことを考慮する必要があるのでしょうか?次の記事でお伝えします。これは小さな問題なので、やらなくても問題ありません。
演算子を作成する場合、最も重要なことは厳密さです。 Dispatcher はカプセル化されたコンポーネントであるため、オペレーターがまったく厳密でないと、欠陥が深く埋もれてしまい、見つけるのが難しくなります。したがって、次の記事では単体テストについて説明します。これにより、Dispatcher の堅牢性を大幅に向上させることができます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。