[原创作品] 对获取多层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

 

posted @ 2016-01-14 16:18  一凡先生  阅读(1200)  评论(0编辑  收藏  举报