zoukankan      html  css  js  c++  java
  • Javascript如何避免连续调用中取到不存在的属性而导致报TypeError错?

    背景:


    在最近的 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"
    
    
  • 相关阅读:
    关于 RuntimeBinderException 异常
    IE 跨域session丢失问题
    一个简单的方法去掉angular application中URLs的hashtag
    ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
    (转载)Why you shouldn't use Entity Framework with Transactions
    angular自启动过程
    HTML中的IE条件注释,让低版本IE也能正常运行HTML5+CSS3网站的3种解决方案
    angualrjs 总结 随记(三)
    angualrjs 总结 随记(二)
    angualrjs 总结 随记(一)
  • 原文地址:https://www.cnblogs.com/xjnotxj/p/9510753.html
Copyright © 2011-2022 走看看