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 相关文章推荐
IE JS无提示关闭窗口不提示的方法
Apr 29 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
使用javascript实现监控视频播放并打印日志
Jan 05 Javascript
基于jQuery实现网页打印功能
Dec 01 Javascript
Javascript从数组中随机取出不同元素的两种方法
Sep 22 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
Jan 18 Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 Javascript
JavaScript创建对象方法实例小结
Sep 03 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
Angular利用HTTP POST下载流文件的步骤记录
Jul 26 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 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
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
php实现简单四则运算器
2020/11/29 PHP
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
Python对列表排序的方法实例分析
2015/05/16 Python
Python实现二叉堆
2016/02/03 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
关于python3中setup.py小概念解析
2019/08/22 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
Python字典dict常用方法函数实例
2020/11/09 Python
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
接口可以包含哪些成员
2012/09/30 面试题
就业推荐自我鉴定
2013/10/06 职场文书
停车场管理制度范本
2015/08/05 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
Python jiaba库的使用详解
2021/11/23 Python
Java使用JMeter进行高并发测试
2021/11/23 Java/Android