js中如何完美的解析数据


Posted in Javascript onMarch 18, 2018

自从有了前后端分离,一些后端小伙伴给出的数据结构也来越混乱了。以为分离减轻了他们的负担接口的质量会非常高但是人的惰性却体现的很“完美”。

由于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
[]

代码测试:https://jsbin.com/zoberem/edit?js,console

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

Javascript 相关文章推荐
深入理解JavaScript中的箭头函数
Jul 28 Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
May 04 Javascript
详解js的事件代理(委托)
Dec 22 Javascript
微信小程序 参数传递实例代码
Mar 20 Javascript
详解vue.js之绑定class和style的示例代码
Aug 24 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
Sep 26 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
Feb 27 Javascript
详解vue-flickity的fullScreen功能实现
Apr 07 Javascript
vue实现简单学生信息管理
May 30 Javascript
解决使用vue.js路由后失效的问题
Mar 17 #Javascript
vue实现的上传图片到数据库并显示到页面功能示例
Mar 17 #Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 #Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 #Javascript
对vue里函数的调用顺序介绍
Mar 17 #Javascript
基于vue2.0动态组件及render详解
Mar 17 #Javascript
Vue实现动态创建和删除数据的方法
Mar 17 #Javascript
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
google地图的路线实现代码
2009/08/20 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
javascript每日必学之封装
2016/02/23 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
最新党员的自我评价分享
2013/11/04 职场文书
幼儿如何来做好自我评价
2013/11/05 职场文书
暑期教师培训方案
2014/06/07 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
银行竞聘报告范文
2014/11/06 职场文书
关于长城的导游词
2015/01/30 职场文书
2015暑期社会实践调查报告
2015/07/14 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书