• 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"
    
    
  • 相关阅读:
    怎样从外网访问内网数据库?
    怎样从外网访问内网Linux系统?
    怎样从外网访问内网Nginx?
    使用Holer外网SSH访问内网(局域网)Linux系统
    使用Holer远程桌面登录家里电脑和公司内网电脑
    使用Holer将本地端口映射到公网
    使用内网映射工具Holer将本地的Web应用映射到公网上访问
    算法学习笔记:关联分析(转)
    Python查看模块信息
    R语言中的因子
  • 原文地址:https://www.cnblogs.com/xjnotxj/p/9510753.html
Copyright © 2020-2023  润新知