zoukankan      html  css  js  c++  java
  • [原创作品] 对获取多层json值的封装

      今天篇头不废话了,交流加群:164858883

      在我们接收后端返回的json数据的时候,在数据缺失的时候,如果直接接收会导致致命错误的发生。可能有些同学会说通常都会有,不用判断直接获取也行。之前我也是这么想的,但从用了node + mongodb之后,发现数据库有些数据项没有的时候,前端报错了。后果就是页面完全失去了响应。比如我们要取一个这样的数据 :

    $.get(url, function(data){
    
    var dd = data.aa.bb.cc.dd;//aa或bb或cc不存在时,此处会导致致命错误,导致一下代码无法执行
    
    });

    在coffee中,dd = data?.aa?.bb?.cc?.dd这样可以解决,生成的js代码是这样的:

    var _ref, _ref1;
    
    if (typeof aa !== "undefined" && aa !== null) {
      if ((_ref = aa.bb) != null) {
        if ((_ref1 = _ref.cc) != null) {
          _ref1.dd;
        }
      }
    }

    就是一层一层判断,在原生js如果这样写特别麻烦,所以我进行了一次封装,欢迎吐槽。

     /**by Steven
             * 用于接收多层json数据,在没有属性的情况下不产生Cannot read property 'xxx' of null
             * @param jsonArray 传入的数据数组[目标对象,'第一层属性名','第二层属性名'....]
             * @param dftVal 当没有找到时返回的默认值
             */
            getJsonAttr: function (jsonArray, dftVal) {
                //非数组,直接返回,只有数据本身返回,保证数组最少有2个元素
                if (dftVal == null) {
                    dftVal = ''
                }
                if (jsonArray == null) {
                    return dftVal
                }
                if (jsonArray.constructor != Array) {
                    return jsonArray
                }
                if (jsonArray.length == 1) {
                    return jsonArray[0];
                }
                var temp = jsonArray[0];
                var returnVal = null;
                //确保传入的第一个值合法
                if (!!temp) {
                    for (i = 1; i < jsonArray.length; i++) {
                        var key = jsonArray[i];
                        if (!!temp[key]) {
                            temp = temp[key];
                            returnVal = temp;
                        } else {
                            returnVal = dftVal;
                            //键值未找到,中断执行
                            break;
                        }
                    }
                }else{
                    returnVal = dftVal;
                }
                return returnVal;
            }
    

      

    这篇居然被踢出了博客园首页,真是伤心,他们说介绍的篇幅太少了。好吧,后来我在使用的时候,发现我忘了去判断传入的第一个参数[obj,'param'......]的obj进行判断,如果obj为null或者为undefined的时候,下面的执行会出错。所以改进了下。额,我我发现我改了下代码块的字体大小,然后,就在代码块前加了个span标签。。。。。,这是博客园的bug。不影响阅读。

    原创作品,转载请注明出处:http://zhutty.cnblogs.com  加q群:164858883

     

  • 相关阅读:
    结对项目开始
    团队项目开始
    个人项目总结
    python面向对象
    OSI七层模型
    Django中的orm的惰性机制
    Python装饰器
    python运算符
    python元祖和列表
    Sencha Touch 1.x 快速入门 第三章 布局(2) Card布局
  • 原文地址:https://www.cnblogs.com/zhutty/p/5130616.html
Copyright © 2011-2022 走看看