背景:


在最近的 NODEJS 项目中,涉及到数据库的查询,回调函数里返回了查询结果,我这样做处理然后返回给前端:

return results.collect_coupon[0].count

但是这样万一 results.collect_coupon 是 undefined,再继续取下去就会抛错(TypeError,所以我激进地改成了这样:

return results && results.collect_coupon && results.collect_coupon[0] && results.collect_coupon[0].count

但是这种写法太过冗长,变量重复出现很不好维护。


[拓展]

这种写法会在从左到右的匹配中如果碰到 0、false、null、undefined,就终止匹配直接返回这个值。

例如:

console.log( 2 && 1 && 0 && false && null && undefined );

return:

0

解决方案:我封装了一个叫ignoreErrorAttr的工具函数


/**
* 支持以字符串的方式取对象的属性或者数组的下标,如果中途取到undefined,就返回某个指定值(默认为空字符串)
*
* 作用:避免对undefined的继续向下取值,防止报TypeError错
*
* @param {object|array} obj 被取属性/下标的变量
* @param {string} search 取字符串
* @param {string} [re=""] 取值失败的默认返回值
* @returns
*/
function ignoreErrorAttr(obj, search = "", re = "") {
const arr = search.split(".");
if (!obj) {
return re;
}
for (let i = 0; i < arr.length; i++) {
if (arr[i].indexOf("[") >= 0 && arr[i].indexOf("]") >= 0) {
let index = arr[i].split("[")[1].split("]")[0]
obj = obj[index];
} else {
obj = obj[arr[i]];
}
if (obj === undefined) {
return re;
}
}
return obj;
}

test:

let obj = {a: {b: [1, 2]}};

console.log(ignoreErrorAttr(obj, "a.b.[1]"));
//2 console.log(ignoreErrorAttr(obj, "a.x.y.z","empty"));
//"empty"

Javascript如何避免连续调用中取到不存在的属性而导致报TypeError错?的更多相关文章

  1. 如何将 JavaScript 代码添加到网页中,以及 <script> 标签的属性

    Hello, world! 本教程的这一部分内容是关于 JavaScript 语言本身的. 但是,我们需要一个工作环境来运行我们的脚本,由于本教程是在线的,所以浏览器是一个不错的选择.我们会尽可能少地 ...

  2. arcgis api for javascript 学习(三) 调用发布地图信息,并将地图属性信息输出到Excel表中

    吐血推荐:网上搜了很久关于webgis地图属性表输出到Excel表,并没能找到相关有价值的信息,在小白面前,这就是一脸懵x啊!网上要么是关于前端如何在页面上直接导出excel,和webgis半毛钱关系 ...

  3. JavaScript进阶(五)js中取小数整数部分函数

    js中取小数整数部分函数 丢弃小数部分,保留整数部分 js:parseInt(7/2) 向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 四舍五入 js: Math.round(7 ...

  4. 【JavaScript】 模拟JQuery的连续调用函数

    连续调用,了解调用主体 var zhangsan = { smoke: function () { console.log("Smoking..."); return this; ...

  5. js中取小数整数部分函数;取小数部分

    1.丢弃小数部分,保留整数部分 parseInt(23.56); 结果:23 2.向上取整,有小数就整数部分加1 Math.ceil(23.56) 结果:24 3,四舍五入. Math.round(2 ...

  6. layui从url中取值 ajax获取当前链接中的变量

    在使用layui(javascript)的时候,  需要从当前页面的url地址中取值, 例如: http://localhost:8081/html/fund-purchase.html?fundID ...

  7. javascript中元素的scrollLeft和scrollTop属性说明

    再说意义之前,前说一下这两个属性的适用范围: 注意:这两个属性只能用于元素设置了overflow的css样式中.否者这两个属性没有任何意义.且overflow的值不能为visible,但可以为hidd ...

  8. 定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表

    最近项目中有一种需求: 大致需求是这样的 通过给定的 用户名和密码 要定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表 项目的结构式struts1 hibernat ...

  9. php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;

    一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...

随机推荐

  1. Django框架之序列化和上传文件

     一.Django的序列化(对于ajax请求) Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1)django序列化的使用方法 . ...

  2. python console 设立快捷键 学习源码 用到英语

    arbitrary---随意 iterable----迭代 invalid syntax   -----无效的语法 subscriptable   ----可索引访问的

  3. kbmmw 的远程桌面功能

    kbmmw 内置了远程桌面控制功能好几年了,好多同学居然不知道这特性,因为kbmmw 默认没有开放这个特性, 今天我就给大家说一下如何开放这个功能,并用官方自带例子说一下使用方法. 首先要开放这个特性 ...

  4. Ajax的爬取心得

    一.查找到js的网址 在我们做爬虫的时候,如何判断一个数据是Ajax(asynchronous JavaScript And Xml,异步的JavaScript和Xml), 首先是数据的加载,在请求网 ...

  5. 49.UILable宽度高度自适应

    第一种: UILabel *labl = [[UILabel alloc]init]; labl.backgroundColor = [UIColor redColor]; labl.numberOf ...

  6. Methods to reduce the number of pipeline stages

    Several techniques have been proposed to reduce the number of pipeline stages. We categorize them in ...

  7. Java,数据库中的数据导入到Excel

    private static void executeMethod(JobExecutionContext arg0) throws Exception{ try { TContrastService ...

  8. 常见笔记本进入bios方法

    联想 y510p ->F2 ThinkPad E431 -> Fn + F1

  9. android:padding和android:margin的区别[转]

    本文综合了:http://zhujiao.iteye.com/blog/1856980 和 http://blog.csdn.net/maikol/article/details/6048647 两篇 ...

  10. (转)自己来控制EntityFramework4.1 Code-First,逐步消除EF之怪异现象

    转自:http://www.cnblogs.com/richwong/archive/2011/07/06/2098759.html 最近的项目开始使用EF4.1,拜读各路大侠文章数遍,满以为可以轻车 ...