现在有个对象
a:{
b:{
d:1
}
}
我用 let x=a.b.d
能取到,但我取一个不存在的属性,比如 let x=a.e.f
就会报错
我现在能想到的是用if(typeof a!==='undefined'&&typeof a.e!==='undefined'&&typeof a.e.f!==='undefined')
判断但很麻烦
有什么办法能直接判断a.e.f这种多级属性存不存在?
现在有个对象
a:{
b:{
d:1
}
}
我用 let x=a.b.d
能取到,但我取一个不存在的属性,比如 let x=a.e.f
就会报错
我现在能想到的是用if(typeof a!==='undefined'&&typeof a.e!==='undefined'&&typeof a.e.f!==='undefined')
判断但很麻烦
有什么办法能直接判断a.e.f这种多级属性存不存在?
除了楼上办法,还可以自定义工具函数
//根据字符串路径获取对象属性 : 'dcjgs[0].count'
function getPropByPath(obj, path) {
let tempObj = obj;
path = path.replace(/\[(\w+)\]/g, '.$1');
path = path.replace(/^\./, '');
let keyArr = path.split('.');
let i = 0;
for (let len = keyArr.length; i < len - 1; ++i) {
if (!tempObj) break;
let key = keyArr[i];
if (key in tempObj) {
tempObj = tempObj[key];
} else {
break;
}
}
return tempObj ? tempObj[keyArr[i]] : null
};
getPropByPath(a, 'b.d') //1
getPropByPath(a, 'b.c') //undefined
getPropByPath(a, 'e.f') //undefined
还可以让getPropByPath(a, 'e.f')输出为null,表示没找到某个key
虽然这种也不优雅,但至少比你现在的写法好
a && a.e && a.e.f
或者是 Optional Chaining
,但兼容性是个大问题。不过 TypeScript
支持,所以还是转 Ts 吧
a?.e?.f
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
Optional Chaining
:目前浏览器支持度不够,还需配合 Babel 使用。