用 JavaScript 对 JSON 进行模式匹配 (Part 1 – 设计)

      在《从 if else 到 switch case 再到抽象》这篇文章里面说到,解决 if else 和 switch case 分支过多的一个方法,就是做一个专用的 dispatcher ,让它来负责进行筛选与转发。至于筛选条件的描述,模式匹配是一种很常见也很好用的方式。在 JavaScript 里面,用 JSON 来描述模式又是相当方便的事情,所以我们来做一个 JSON 模式匹配工具吧。

  用例设计

      作为一个 dispatcher ,我们只需要两个方法: notifycapture 。一个最简单的用例是这样的:

   
    
     1 
    Dispatcher.capture({
2 " status " : 200 ,
3 " command " : " message "
4 }, function (json) { /* display message */ });
5
6 Dispatcher.notify({
7 “status " : 200,
8 " command " : " message " ,
9 " content " : {
10 " from " : " user1 " ,
11 " to " : " user2 " ,
12 " text " : " hello "
13 }
14 });

       当然,只有局部的全等匹配是不够的,我们还需要一些其他运算符。

   
    
     1 
    Dispatcher.capture({
2 " value1$eq " : " hello " , /* equal */
3 " value2$ne " : true , /* not equal */
4 " value3$lt " : 0 , /* less than */
5 " value4$lte: 1, /* less than or equal */
6 " value5$gt " : 2, /* greater than */
7 " value6$gte " : 3, /* greater than or equal */
8 " value7$ in " : [1, 3, 5, 7, 9], /* in */
9 " value8$nin " : [2, 4, 6, 8, 10], /* not in */
10 " value9$all " : [1, 2, 3, 4, 5], /* all */
11 " value10$ex " : true, /* exists */
12 " value11$re " : /^A.*/, /* regular expression */
13 " value12$ld " : function(json) { return true; } /* lambda */
14 }, function(json) {});
15
16 Dispatcher.notify({
17 " value1 " : " hello " ,
18 " value2 " : false,
19 " value3 " : -1,
20 " value4 " : 1,
21 " value5 " : 3,
22 " value6 " : 3,
23 " value7 " : 5,
24 " value8 " : 5,
25 " value9 " : [1, 3, 5, 2, 4],
26 " value10 " : " hello " ,
27 " value11 " : " A13579 " ,
28 " value12 " : " anything "
29 })

      随手写下来一堆运算符,看起来实现会很复杂?其实不会有多复杂。在下一篇文章里面,我们会讨论如何设计一个运算符接口,然后逐一实现这些运算符。如果你对此有兴趣,欢迎在 Twitter 上关注我: @CatChen fe36787aa9174b739667caeaa60d33b9

玄机博客
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容