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 获取select下拉列表值的代码
Sep 07 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
jQuery操作表单常用控件方法小结
Mar 23 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
Javascript基础_嵌入图像的简单实现
Jun 14 Javascript
zTree树形插件异步加载方法详解
Jun 14 Javascript
Vue渲染函数详解
Sep 15 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
Sep 25 Javascript
vue router 传参获取不到的解决方式
Nov 13 Javascript
Javascript实现简易天数计算器
May 18 Javascript
jQuery实现电梯导航模块
Dec 22 jQuery
解决使用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
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
使用python加密自己的密码
2015/08/04 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Python 代码调试技巧示例代码
2020/08/11 Python
python mock测试的示例
2020/10/19 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
如何判断计算机可能已经中马
2013/03/22 面试题
Java基础面试题
2012/11/02 面试题
教师个人鉴定材料
2014/02/08 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
就业推荐表院系意见
2015/06/05 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers