JS简码转换

作者: hi_yjs | 来源:发表于2017-07-31 17:03 被阅读62次

    APP开发中免不了与服务器交互,而有些项目为了节省流量等原因,会要求不用全码而用简码(比如用户id不用uid,而用a)来交互。可这样的字段名称不易懂,不利于开发。在原生iOS中我们有第三方的YYModel可以轻松实现全码与简码的转换,但像RN等是使用JS来写的,似乎还没有类似的工具。于是我自己写了一个简易的转换工具。
      老规矩,不Bibi,直接上代码:

    /**初始化专用返回对象简->全码映射表*/
    const loginResp = {
        'a': 'update',
        'b': 'user',
        'c': 'readInfo'
    };
    
    const user = {
        'a': 'uid',
        'b': 'userName'
    };
    
    const readInfo = {
        'a': 'time',
        'b': 'readers'
    };
    
    const readers = {
        'a': 'readerId',
        'b': 'readerName',
        'c': 'status'
    };
    
    /**专用返回对象映射表*/
    const respMap = {
        'loginResp': loginResp,
        'user': user,
        'readInfo': readInfo,
        'readers': readers
    };
    
    /**
     * 简码转全码
     * 
     * 参数说明:
     *  > resp 专用返回对象名称
     *  > json 返回的json
     * 返回说明:
     *  若字段在映射表中,则转为全码;
     *  若字段不在映射表中,则原样返回;
     *  数据结构与值不变
     */
    export function changeToFull(resp, json) {
      if (respMap.hasOwnProperty(resp)) {
        let full = {};
        let keyMap = respMap[resp];
    
        for(var key in json){
          let fullKey = keyMap.hasOwnProperty(key) ? keyMap[key] : key;
          //在我们的项目中是Object需要转换的比数组要多得多,所以作为if的第一判断
          if (json[key] instanceof Object && !(json[key] instanceof Array)) { 
            //如果是Object则递归调用
            full[fullKey] = changeToFull(fullKey, json[key]);
          } else if (json[key] instanceof Array && json[key].length > 0 && json[key][0] instanceof Object && respMap.hasOwnProperty(fullKey)) {
            let tempArray = json[key];
            let tempFullArray = [];
            for (var i = 0; i < tempArray.length; i++) {
              let tempObj = changeToFull(fullKey, tempArray[i]);
              tempFullArray.push(tempObj);
            };
            full[fullKey] = tempFullArray;
          } else {
            full[fullKey] = json[key];
          };
        }
        return full;
      } else{ //映射表中没有,原样返回
        return json;
      };
    }
    

    这时候,您可能一脸懵逼——最开始那几个奇怪的常量是干嘛的?其实就是一些返回对象的简->全码对应关系,具体如下表:

    图1
      而respMap则是专用返回对象映射表,我们需要去维护这个映射表,下面的方法changeToFull(resp, json)才能正常使用。
      通常服务器返回的内容,无非就是普通数据类型、对象类型与数组三种,上面方法的三个分支也正是针对这三种类型做处理。为了验证该方法对复杂数据结构同样适用,我们模拟一个多种数据类型相互嵌套的返回对象,具体如下:
      "loginResp": {
        "a": false,
        "b":{
          "a": 9527,
          "b": "大圣遛码",
        },
        "c":[{
          "a": "2017-07-07",
          "b":[{
            "a": 666,
            "b": "reader1",
            "c": 0
          }]
        },{
          "a": "2017-07-08",
          "b":[{
            "a": 666,
            "b": "reader1",
            "c": 1
          },{
            "a": 888,
            "b": "reader2",
            "c": 1 
          }]
        }],
      }
    

    这样的数据结构够复杂了吧~数组字典各种嵌套,并且是用简码返回,非常不利于开发理解,于是我们把数据丢到我们的方法里,拿到返回对象再来看看:

    {
      "update": false,
      "user":{
        "uid": 9527,
        "userName": "大圣遛码",
      },
      "readInfo":[{
        "time": "2017-07-07",
        "readers":[{
          "readerId": 666,
          "readerName": "reader1",
          "status": 0
        }]
      },{
        "time": "2017-07-08",
        "readers":[{
          "readerId": 666,
          "readerName": "reader1",
          "status": 1
        },{
          "readerId": 888,
          "readerName": "reader2",
          "status": 1 
        }]
      }],
    }
    

    这样来看就非常清晰明了了~
      (全码转简码也是类似的,就留给读者朋友们自行发挥啦~)

    相关文章

      网友评论

        本文标题:JS简码转换

        本文链接:https://www.haomeiwen.com/subject/cjurlxtx.html