在说正事之前,我要推荐一个福利:(你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>),好了下面开始说正事:
使用一个数据对象较深层次的属性,为了容错需要逐层判断是否存在某个属性,这种长长的判断应该如何写比较优雅?
比如:
`
if (data.school && data.school.class && data.school.class.students && data.school.class.students[10] && data.school.class.students[10].name) {
alert(data.school.class.students[10].name)
}
`
Optional chaining
babel和TS都支持了
或者写个自带maybe monad的proxy
###序列化对象(空则忽略)->正则匹配,应该是满足你的问题域的,不过序列化还会层级遍历对象,所以在时间复杂度上没有优化
另:见过同事用Optional封装域对象并使用 JOOQ
,那个全是链式调用,不过比你不停手写判断要方便
方案一:
这样写美化一些,比都写在一行要好看:
if (data.school
&& data.school.class
&& data.school.class.students
&& data.school.class.students[10]
&& data.school.class.students[10].name) {
alert(data.school.class.students[10].name)
}
方案二:
写个方法找对象的子属性:
Object.prototype.getObjVal = function(key) {
const _ = (obj) => {
const keys = Object.keys(obj)
const len = keys.length
for (let i = 0; i < len; i++) {
const k = keys[i]
const val = obj[k]
if (key === k) {
return val
} else if (Object.prototype.toString.call(val) === '[object Object]') {
let res = _(val)
if (res !== undefined) {
return res
}
}
}
}
return _(this)
}
// 下面就是简化后的代码:
const students = data.getObjVal('students')
if (students && students[10]) {
students[10].name && alert(students[10].name)
}
###
封装一个方法,强制改变数据,保证需要的数据一直存在
// 定义一个数据格式,保证 res.data.staff.list 不会出错,且为数组
const MY_DATA_FORMAT = {
code: '',
data: {
staff: {
list: []
}
}
}
const data1 = ns.dataLayout(MY_DATA_FORMAT, {
data: {
staff: {
id: '123',
name: '加快建'
}
}
})
const data2 = ns.dataLayout(MY_DATA_FORMAT, '没有数据')
console.log('data1', data1)
console.log('data2', data2)
###
用 try catch ?
var data = {}
console.log('之前代码');
try {
alert(data.school.class.students[10].name)
} catch (error) {
}
console.log('之后代码');
郑重声明:本站部分内容转载自网络,版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们(QQ/微信153890879)修改或删除,多谢。