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 相关文章推荐
从新浪弄下来的全屏广告代码 与使用说明
Mar 15 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 Javascript
jQuery中delegate()方法用法实例
Jan 19 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 Javascript
Vue.js实战之Vuex的入门教程
Apr 01 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
Aug 02 Javascript
微信小程序 checkbox使用实例解析
Sep 09 Javascript
layui的数据表格+springmvc实现搜索功能的例子
Sep 28 Javascript
详解JavaScript中Arguments对象用途
Aug 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
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
JavaScript的Cookies
2008/01/16 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
Python栈类实例分析
2015/06/15 Python
Python上下文管理器和with块详解
2017/09/09 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
详解python中index()、find()方法
2019/08/29 Python
Python多分支if语句的使用
2020/09/03 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
公司合作意向书
2014/04/01 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
争先创优心得体会
2014/09/12 职场文书
个人学习总结范文
2015/02/15 职场文书
学校少先队工作总结
2015/08/12 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python
python playwrigh框架入门安装使用
2022/07/23 Python