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验证日期的格式YYYY-mm-dd 具体实现
Jun 29 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
input输入框鼠标焦点提示信息
Mar 17 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
js实现常见的工具条效果
Mar 02 Javascript
如何正确理解javascript的模块化
Mar 02 Javascript
JavaScript结合HTML DOM实现联动菜单
Apr 05 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
微信小程序实现简单评论功能
Nov 28 Javascript
node.js实现上传文件功能
Jul 15 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
php数组去除空值函数分享
2015/02/02 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
Python模拟用户登录验证
2017/09/11 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
python lxml中etree的简单应用
2019/05/10 Python
python nmap实现端口扫描器教程
2020/05/28 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
终端业务员岗位职责
2013/11/27 职场文书
迟到早退检讨书
2014/02/10 职场文书
质检部经理岗位职责
2014/02/19 职场文书
经典团队口号
2014/06/06 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书