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 相关文章推荐
Js中sort()方法的用法
Nov 04 Javascript
对象的类型:本地对象(1)
Dec 29 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
Apr 12 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
webpack4的迁移的使用方法
May 25 Javascript
JavaScript中import用法总结
Jan 20 Javascript
vue-cli 3.x配置跨域代理的实现方法
Apr 12 Javascript
原生JS实现动态添加新元素、删除元素方法
May 05 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
May 16 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
Oct 13 Javascript
JavaScript实现前端倒计时效果
Feb 09 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
PHP4在Windows2000下的安装
2006/10/09 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
Js获取事件对象代码
2010/08/05 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
python 布尔操作实现代码
2013/03/23 Python
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
python根据url地址下载小文件的实例
2018/12/18 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
python上selenium的弹框操作实现
2020/07/13 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
英国最大的户外商店:Go Outdoors
2019/04/17 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
酒店保安员岗位职责
2014/01/31 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android