有一个对象
a:{
b:{
c:{
....
}
}
}
要取值
let val = a.b.c.d.e.f;
必须判断前面几级是否存在,否则执行时会报错。所以一般要写成这样
if (a && a.b && a.b.c && a.b.c.d && a.b.c.e) {
let val = a.b.c.d.e.f;
}
有无优雅的写法或node包可以解决?
有一个对象
a:{
b:{
c:{
....
}
}
}
要取值
let val = a.b.c.d.e.f;
必须判断前面几级是否存在,否则执行时会报错。所以一般要写成这样
if (a && a.b && a.b.c && a.b.c.d && a.b.c.e) {
let val = a.b.c.d.e.f;
}
有无优雅的写法或node包可以解决?
说下个人看法。
首先超过3级(包括3级)的嵌套不应该太多,如果有,首先看看是不是设计上除了问题。其次,如果遇到了,那么
必须判断前面几级是否存在
这个是没有必要的,报错才是正常的,提醒你哪里写漏或写错,改掉就好了,即使是在插件或者框架中,也是对个别比较重要的参数进行验证,否则调用一方很难判断错误源。参数验证大多不会是这种地方(提示xxx是undeifed或者null,xxx() is not a function这种),一般的异常提示(error),旨在明确一个复杂逻辑或亦混淆逻辑的错误源。
// 类似的方法不可以,如果中间有一个是 undefined
// 就会报 Cannot read property 'XXX' of undefined 的错误
if (a.b.c.d.e.f != undefined){
// do something
}
我目前在用的方法很简单,不需要引入任何包:
try {
let val = a.b.c.d.e.f
console.log(val)
} catch {
// a.b.c.d.e.f 不存在
}
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
lodash的 get。