自从有了前后端分离,一些后端小伙伴给出的数据结构也来越混乱了。以为分离减轻了他们的负担接口的质量会非常高但是人的惰性却体现的很“完美”。
由于js是若类型的语言,所以在使用数据的时候经常会出现这个几个错误

TypeError: Cannot read property 'xxx' of undefined
TypeError: Cannot read property 'xxx' of null
TypeError: xxx.map is not a function

而这些异常很难发现,及时发上线了都不一定能发现。因为这些问题都是由于数据异常导致的。如果优雅的解决或者说避免这些问题影响到用户体验呢?

// 第一种做法肯定是这样的
if(a){return a.name || '你没名字'
}
// 这种做法处理简单的还能凑合用,但是如果你遇到这样的呢 user.country.area.city.name,难道要这样写
if(user && user.country && user.country.area && user.country.area.city){return user.country.area.city.name || '你没名字'
}
// 这是多么痛苦的一件事情 @后端兄弟// 第二种,感谢es6
let {country={area:{city:{name:'你没名字'}}}} = user;
这个感觉也不是很好的解决方案// 第三种,利用reduce构建一个解析函数
function getValue(obj,key){return key.split('.').reduce(function(o,k){// o,当前对象// key,数组下一个元素if((typeof o === 'undefined' || o === null)){return k.indexOf('[array]') !== -1?[]:o}else{return k.indexOf('[array]') !== -1?(o[k.replace('[array]','')]||[]):o[k]}},obj)
}let user1;let user2 = {}let user3 = {country:{area:{city:{name:'12312'}}}
}
let user4 = {country:[{city:{name:'12312'}}]
}let user5 = {country:{city:[1,2,3]}
}console.log(getValue(user1,'country.area.city.name'))console.log(getValue(user2,'country.area.city.name'))console.log(getValue(user3,'country.area.city.name'))console.log(getValue(user5,'country.city[array]'))
console.log(getValue(user5,'country.city[array].1'))
console.log(getValue(user5,'country.city[array].10'))
console.log(getValue(user5,'country.city[array].1.name'))
console.log(getValue(user5,'country.city[array].persion[array]'))// 输出结果
undefined
undefined
"12312"
[1, 2, 3]
2
undefined
undefined
[]

测试代码

最后关于前端异常上报,这是一个很大的研究方向,市面上也有一些解决方案,但是真正推广的我目前没发现。

js中如何优雅的解析数据相关推荐

  1. js中请求URL获得json数据,将数据解析并建表插入

    //打开数据库 var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); //html请求数据 function testXm ...

  2. js中如何优雅的写if判断

    我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃 ...

  3. d3.js中选择元素和绑定数据

    回顾一下如何选择元素 在 D3 中,用于选择元素的函数有两个: d3.select():是选择所有指定元素的第一个 d3.selectAll():是选择指定元素的全部 这两个函数返回的结果称为选择集. ...

  4. Java中如何利用gson解析数据

    最近在学习Java,需要用到json,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson,带着一些好奇心,我开始使用了gson. 经过比较,gson ...

  5. Vue.js中data,props和computed数据

    在用Vue.js做开发的时候,一定知道 data, props和computed.用了这么久的Vue就总结一下这个三个东西,首先看看官网怎么定义他们,https://cn.vuejs.org/v2/a ...

  6. php如何获取js中的内容_解析PHP中的Javascript提取

    我正在通过Javascript调用帖子请求,这是它的外观, function syncDeviceId(deviceID, mod){ var request = new Request('url', ...

  7. js中websocket基本使用及数据量过大或推送频率过快等基本问题

    WebSocket的定义 WebSocket是html5提供的一种在单个TCP连接上进行双向通信的协议,解决了客户端和服务端之间的实时通信问题.浏览器和服务器只需完成一次握手,两者之间就可以创建一个持 ...

  8. js中如何优雅修改一个多层嵌套list对象的值

    如何优雅更改一个N层嵌套对象属性的值 看下边的代码,要加工一个嵌套list的属性值,然后再赋值回去,大概只能这样写: dp.data.treelist = dp.data.treelist.map(. ...

  9. js中常见的Json解析

    一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式, 是理想的数据交换格式,同时,JSON是 JavaSc ...

最新文章

  1. Android 分享机顶盒项目的封装类《GridView》
  2. python使用阿里云sdk
  3. Entity Framework 学习结束语
  4. csol战损左轮python_CSOL欢乐拍卖会迎新春 7把战损版武器登录即赠
  5. 中国殡葬行业投资战略建议与前景策略分析报告2022-2028年版
  6. 【渝粤教育】国家开放大学2018年春季 8126-21T制药工程 参考试题
  7. mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法
  8. 解决:Truncated incorrect DOUBLE value: xxxX-1‘
  9. 3层b+树索引访问磁盘次数_从B+树到LSM树,及LSM树在HBase中的应用
  10. TensorFlow tf.keras.layers.DenseFeatures
  11. PHP读写指定URL参数的方法
  12. 每天学一点flash(4) 数组与xml配合使用
  13. 本地管理表空间(LMT)
  14. EXCEL中,函数中的双引号如何表示?
  15. 最新Latex安装详细教程
  16. 机器学习-降维方法-有监督学习:LDA算法(线性判别分析)【流程:①类内散度矩阵Sw->②类间散度矩阵Sb->计算Sw^-1Sb的特征值、特征向量W->得到投影矩阵W->将样本X通过W投影进行降维】
  17. 无线AP Aruba-515初始化设置
  18. Linux安装R相关包出现icudt error
  19. 某计算机主存空间为4MB,一个有32位程序地址空间,页面容量为1KB, 主存的容量为4MB的存储系统,问:(1) 虚页号字段 - 试题答案网问答...
  20. 【零基础 快速学Java】韩顺平 p104-147 流程控制:顺序、分支、循环、跳转 控制语句 (if、for、while、dowhile、break、continue、return)

热门文章

  1. 124 Binary Tree Maximum Path Sum
  2. 分享懒人张RDLC报表(四)
  3. 用openssl跟Gmail的smtp对话(一)
  4. win10下mysql 8.0.18 安装配置方法图文教程
  5. LeetCode算法题1:判断整数数组是否存在重复元素
  6. 微软宣布Azure Function支持Python
  7. WPF 窗口居中 变更触发机制
  8. Skynet通讯遇到的奇怪问题
  9. 实现和调用API接口
  10. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(12)--- 策略化加锁...