在开发过程中经常会遇到一个常见的问题,就是通过Ajax请求后台得到一段 Data 数据,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "code":200, "state":0, "data":{ "name":'张三', "email": 'jack@dev.com', "personalInfo": { name: 'Jack', address: { line1: 'westwish st', line2: 'washmasher', city: 'wallas', state: 'WX' } } } }
|
如上当我们得到上面一个信息的,我想获取address字段,需要
1 2
| var data = resource.data var address = data.personalInfo.address
|
这段代码看起来没什么问题,但是当遇到一些边缘情况的时候就会出现问题了,如果访问对象的属性是null或者undefind 的时候,控制台会抛出一个异常,比如:
1 2
| var data = resource.data var address = data.personalInfo.info.name
|
当我们访问data.personalInfo.info得到的是一个undefind值,然后访问undefind的name 会报错。
1 2
| VM2268:1 Uncaught TypeError: Cannot read property 'name' of undefined at <anonymous>:1:10
|
- 常见做法
1
| const name = user && user.personalInfo ? user.personalInfo.name : null;
|
如果嵌套结构层级太多会导致难以理解
二. 最佳实践
1
| const name = ((user || {}).personalInfo || {}).name;
|
1 2 3 4
| const getNestedObject = (nestedObj, pathArr) => { return pathArr.reduce((obj, key) => (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj); }
|
1 2 3 4 5 6 7 8
| var getPath = function (obj, keyStr) { return key.split(".").reduce(function(o, x) { return (typeof o == "undefined" || o === null) ? o : o[x]; }, obj); }
getPath(data, 'personalInfo.name') getPath(data, 'personalInfo.info.name')
|