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


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

    用例设计

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

    Dispatcher.capture({
      "status": 200,
      "command": "message"
    }, function(json) { /* display message */ });

    Dispatcher.notify({
      “status": 200,
      "command": "message",
      "content": {
        "from": "user1",
        "to": "user2",
        "text": "hello"
      }
    });

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

    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"
    })

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

  • 相关阅读:
    Yii2中request的使用
    git在本地仓库直接使用rm彻底删除文件,服务端还是存在
    oc基础-oc中之集合NSSet,NSMutableSet
    oc基础-oc中之集合NSArray,NSMutableArray
    oc基础-NSString和NSMutableString区别
    oc基础-Foundation中NSString类型的一些用法
    oc基础-foundation框架中的常用结构体
    oc基础-设计代理模式理解
    oc基础-protocol协议的使用
    block关键字的使用
  • 原文地址:https://www.cnblogs.com/cathsfz/p/1776387.html
Copyright © 2020-2023  润新知