今天篇头不废话了,交流加群: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

[原创作品] 对获取多层json值的封装的更多相关文章

  1. Jquery表单提交后获取返回Json值

    1.给form添加id值: <form action="/News/SaveMessage" method="post" accept-charset=& ...

  2. JS 根据Url参数名称来获取对应的值 方法封装

    function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  3. Python 获取MD5加密值

    Python 获取MD5加密值方法封装 import hashlib def get_md5(s): """获取MD5加密值 :param s: 需要加密的字符串 :re ...

  4. asp 获取url 返回值 和 对json 返回值的处理

    Function GetHttpPage(HttpUrl,endoce) If endoce = "" Then endoce = "GB2312" If Is ...

  5. C# 获取Newtonsoft.Json的JObject多层节点内容

    json形如 { "object":{ "name":"cwr" }, " } 要获取name的值,则需要构造两个JObject来 ...

  6. C#:Json数据反序列化为Dictionary并根据关键字获取指定的值

    转自曾是土木人原文 C#:Json数据反序列化为Dictionary并根据关键字获取指定的值 Json数据: { "dataSet": { "header": ...

  7. Jmeter 通过json Extracted 来获取 指定的值的id

    在没有 精确或模糊查询的接口时可以使用jmeter 获取指定的值的ID import java.lang.String ; String getTargetName="iphone632g& ...

  8. (原创)【MAUI】在窗口(页面)关闭后获取其返回值

    一.前言 作为一名 Winform 和 WPF 的老用户,没想到 MAUI 上变化那么大. 就像传统的窗口,我弹出一个模式窗口,关闭窗口后是可以获取到窗口的返回值的,即: DialogResult.后 ...

  9. [原创作品] javascript 实现的web分页器原理

    很久没有写博客了,因为最近忙于一些杂七杂八的事情.不过,互联网的价值在于信息共享,因为共享,所以互联网才能飞快发展.博主建了一个技术共享qq群:164858883,因为目前人数还比较少,活跃度还不是很 ...

随机推荐

  1. PHP博客小项目之知识点(1)

    一.博客系统介绍 Blog.Bloger.web log(网络日志) 博客主要发布一些文章.图片:博客一般都是个人博客: 博客的文章,一般都是按照时间倒序排列: 博客,仅音译,英文名为Blogger, ...

  2. CADisplayLink的简单使用

    CADisplayLink类似NSTimer是一个定时器,只不过是一秒会调用60次指定的方法 使用方法: #import "ViewController.h" @interface ...

  3. switch case加条件语句(非等值) php

    <?php $s_level=rand(1,6); echo $s_level.'<br/>'; switch(true){ case $s_level<3 : echo 'l ...

  4. gcc使用笔记

    1.如何在gcc中传输宏定义? 参考如下红色部分,可以传入宏定义 gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-p ...

  5. 高性能Socket组件和RPC,让你像写本地代码一样开发网络应用和分布式程序

    最近想试试C#能不能写出高性能的分布式组件,于是写了一个双工RPC,也当练手,下面是单连接的测试结果,非常给力.机器配置:U:E1230-v2,内存:ddr3-8G 1.递归调用    过程:Clie ...

  6. easyui最小化后停留在页面的右下角

    0.此方法没有什么技术含量,纯属于自己瞎想的!如果有的好方法,请留言告之谢谢!! 1.直接上代码: $('#winId').window({ onMinimize: function () { //最 ...

  7. 成功启动了Apache却没有启动apache服务器

    原因没有用管理员身份运行...

  8. ANDROID 自动生成动态表格for

    简单的栗子去了解这个自动生成的动态的控件(自动生成表格) /cs-Layout/res/layout/activity_main.xml <LinearLayout xmlns:android= ...

  9. 将Android 工程从Windows导入到Ubuntu 下java类中的中文在ADT中乱码

    解决方法: 右键工程-->Properties->Resource->Text file encoding->Other 手动输入GBK ->点击OK (Other 中是 ...

  10. Pig Apache Hadoop

    http://blog.cloudera.com/blog/2009/06/analyzing-apache-logs-with-pig/