浅谈如何安全取得对象的值

背景详情

var obj = {
    a:{
        b:{
            c:[1,2,3]
        }
    }
}

当我们需要读取该对象中数组的某个值时如下

obj.a.b.c[1];

可是自己读取,代码的容错几乎为0,如果obj对象中没有a属性会报错,obj.a中没有b会报错,obj.a.b没有c会报错。这样的报错信息在与后台交互中,数据渲染经常出现,为了解决该问题,常见的使用方法

obj || obj.a || obj.a.b || obj.a.b.c || obj.a.b.c[1]

由上面代码可看出,在浅层嵌套中,使用该方法能有效避免数据错误问题。如果深层嵌套,会导致读取属性冗余。

方法改进

扩展对象方法

;(function(){
    if(Object.prototype.getSafetyVlaue) return false;
    Object.prototype.getSafetyVlaue = function(str,df){    // str为属性调用字符串,df为查询为空默认返回字段
        if((typeof str).toLowerCase() !== 'string') throw 'getSafetyVlaue options is error.'
        var arr = str.split('.'),
            obj = this,
            df = df || null;
        for(var i = 0;i < arr.length;i++){
            if(obj[arr[i]] === null || obj[arr[i]] === undefined) return df;
            obj = obj[arr[i]]
        }
        return obj
    }
})()
console.log(obj.getSafetyVlaue('a.b.c.1'));  // 2
console.log(obj.getSafetyVlaue('c.b.c.1'));  // null
console.log(obj.getSafetyVlaue('c.b.c.1','默认值'));  // 默认值

上面可以看见,给对象扩展一个方法为getSafetyVlaue方法,由于该方法扩展给的是对象,所以使用之前依然得先判断obj对象存在,也就是把多层短路改为一层短路来执行。同为,为此也进行了另一种变种的改进,在不变逻辑的基础上进行另外一种变种,添加数组方法:

;(function(){
    if(Array.prototype.getObjectValue) return false;
    Array.prototype.getObjectValue = function(obj,df){
        if((typeof obj).toLowerCase() !== 'object') throw 'getObjectValue options is error.'
        var o = obj;
        df = df || null;
        if(!o) return df
        for(var i = 0;i<this.length;i++){
            if(o[this[i]] === null || o[this[i]] === undefined) return df;
            o = o[this[i]]
        }
        return o;
    }
})()
console.log(['a','b','c',1].getObjectValue(obj))  // 2
console.log(['c','b','c',1].getObjectValue(obj))  // null
console.log(['c','b','c',1].getObjectValue(obj,'默认值'))  // 默认值
该变种方法好处在于需要判断的数组是我们控制的,无需自己添加任何判定条件,可是博主个人认为将一个对象读取方法扩展到一个数组方法中不便于理解,所以两种方法算各有优劣吧。

方法延伸

网上还有更多的方法进行该操作的处理,有兴趣的可以继续多深入看看。

表单对象对象和持久化对象是软件开发中常见的概念,它们在不同的场景下有着不同的作用。 表单对象是指用于表示表单数据的对象,通常包含了表单中所有的输入项以及它们对应的。表单对象通常用于在用户提交表单之前对表单数据进行验证、格式化等操作,以保证数据的正确性和完整性。在后端处理表单数据时,表单对象可以方便地将表单数据转换为其他类型的对象,如对象或持久化对象对象是指用于表示某个对象,通常包含了该的各种属性和方法。对象通常用于封装一些常用的、复杂的数据类型,如日期、时间、金额等,以便于在代码中使用和管理。对象通常是不可变的,即一旦创建就不能修改,这样可以避免在不同地方对同一个对象进行修改而导致数据不一致的问题。 持久化对象是指用于表示存储在数据库中的数据的对象,通常包含了数据库表中的各个字段以及它们对应的。持久化对象通常用于在应用程序和数据库之间进行数据交换。在应用程序中,持久化对象通常是通过ORM(对象关系映射)框架来生成和管理的,ORM框架可以将持久化对象与数据库表进行映射,从而方便地进行数据的增删改查操作。 总之,表单对象对象和持久化对象都是软件开发中常见的概念,它们在不同的场景下有着不同的作用,开发人员需要根据具体的需求来选择使用哪种对象类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值