用JavaScript對JSON進(jìn)行模式匹配(Part 1-設(shè)計(jì))
更新時間:2010年07月17日 17:31:00 作者:
在《從 if else 到 switch case 再到抽象》這篇文章里面說到,解決 if else 和 switch case 分支過多的一個方法,就是做一個專用的 dispatcher ,讓它來負(fù)責(zé)進(jìn)行篩選與轉(zhuǎn)發(fā)。
至于篩選條件的描述,模式匹配是一種很常見也很好用的方式。在 JavaScript 里面,用 JSON 來描述模式又是相當(dāng)方便的事情,所以我們來做一個 JSON 模式匹配工具吧。
用例設(shè)計(jì)
作為一個 dispatcher ,我們只需要兩個方法: notify 和 capture 。一個最簡單的用例是這樣的:
Dispatcher.capture({
"status": 200,
"command": "message"
}, function(json) { /* display message */ });
Dispatcher.notify({
“status": 200,
"command": "message",
"content": {
"from": "user1",
"to": "user2",
"text": "hello"
}
});
當(dāng)然,只有局部的全等匹配是不夠的,我們還需要一些其他運(yùn)算符。
Dispatcher.capture({
"value1$eq": "hello", /* equal */
"value2$ne": true, /* not equal */
"value3$lt": 0, /* less than */
"value4$lte: 1, /* less than or equal */
"value5$gt": 2, /* greater than */
"value6$gte": 3, /* greater than or equal */
"value7$in": [1, 3, 5, 7, 9], /* in */
"value8$nin": [2, 4, 6, 8, 10], /* not in */
"value9$all": [1, 2, 3, 4, 5], /* all */
"value10$ex": true, /* exists */
"value11$re": /^A.*/, /* regular expression */
"value12$ld": function(json) { return true; } /* lambda */
}, function(json) {});
Dispatcher.notify({
"value1": "hello",
"value2": false,
"value3": -1,
"value4": 1,
"value5": 3,
"value6": 3,
"value7": 5,
"value8": 5,
"value9": [1, 3, 5, 2, 4],
"value10": "hello",
"value11": "A13579",
"value12": "anything"
})
隨手寫下來一堆運(yùn)算符,看起來實(shí)現(xiàn)會很復(fù)雜?其實(shí)不會有多復(fù)雜。在下一篇文章里面,我們會討論如何設(shè)計(jì)一個運(yùn)算符接口,然后逐一實(shí)現(xiàn)這些運(yùn)算符。
用例設(shè)計(jì)
作為一個 dispatcher ,我們只需要兩個方法: notify 和 capture 。一個最簡單的用例是這樣的:
復(fù)制代碼 代碼如下:
Dispatcher.capture({
"status": 200,
"command": "message"
}, function(json) { /* display message */ });
Dispatcher.notify({
“status": 200,
"command": "message",
"content": {
"from": "user1",
"to": "user2",
"text": "hello"
}
});
當(dāng)然,只有局部的全等匹配是不夠的,我們還需要一些其他運(yùn)算符。
復(fù)制代碼 代碼如下:
Dispatcher.capture({
"value1$eq": "hello", /* equal */
"value2$ne": true, /* not equal */
"value3$lt": 0, /* less than */
"value4$lte: 1, /* less than or equal */
"value5$gt": 2, /* greater than */
"value6$gte": 3, /* greater than or equal */
"value7$in": [1, 3, 5, 7, 9], /* in */
"value8$nin": [2, 4, 6, 8, 10], /* not in */
"value9$all": [1, 2, 3, 4, 5], /* all */
"value10$ex": true, /* exists */
"value11$re": /^A.*/, /* regular expression */
"value12$ld": function(json) { return true; } /* lambda */
}, function(json) {});
Dispatcher.notify({
"value1": "hello",
"value2": false,
"value3": -1,
"value4": 1,
"value5": 3,
"value6": 3,
"value7": 5,
"value8": 5,
"value9": [1, 3, 5, 2, 4],
"value10": "hello",
"value11": "A13579",
"value12": "anything"
})
隨手寫下來一堆運(yùn)算符,看起來實(shí)現(xiàn)會很復(fù)雜?其實(shí)不會有多復(fù)雜。在下一篇文章里面,我們會討論如何設(shè)計(jì)一個運(yùn)算符接口,然后逐一實(shí)現(xiàn)這些運(yùn)算符。
相關(guān)文章
tangram.js庫實(shí)現(xiàn)js類的方式實(shí)例分析
這篇文章主要介紹了tangram.js庫實(shí)現(xiàn)js類的方式,結(jié)合實(shí)例形式分析了tangram.js庫實(shí)現(xiàn)類的創(chuàng)建、繼承等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01javascript表單驗(yàn)證 - Parsley.js使用和配置
大家還記得我們曾經(jīng)介紹過的表單驗(yàn)證jquery插件jquery.validationEngine吧;天介紹的Parsley同樣也可以幫助你只使用簡單的配置即可實(shí)現(xiàn)表單驗(yàn)證功能,基于它的強(qiáng)大DOM-API,感興趣的你可以不要錯過了哦2013-01-01JavaScript事件循環(huán)剖析宏任務(wù)與微任務(wù)
這篇文章主要為大家介紹了JavaScript事件循環(huán)剖析宏任務(wù)與微任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10javascript獲取設(shè)置div的高度和寬度兼容任何瀏覽器
Javascript如何獲取和設(shè)置div的高度和寬度,并且兼容任何瀏覽器,感興趣的朋友不妨看看下面的代碼或許有意想不到的收獲2013-09-09JavaScript實(shí)現(xiàn)全選或反選功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)全選或反選功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08JS實(shí)現(xiàn)slide文字框縮放伸展效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)slide文字框縮放伸展效果代碼,涉及JavaScript響應(yīng)鼠標(biāo)事件動態(tài)操作頁面元素屬性的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11JavaScript字符串截取方法總結(jié)(slice、substring、substr等)
在開發(fā)中常常會需要截取字符串,而 JavaScript 提供了很多種方法實(shí)現(xiàn)截取操作,本文對各種方法做個整理,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01