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 相关文章推荐
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
Oct 06 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
js验证真实姓名与身份证号,手机号的简单实例
Jul 18 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 Javascript
js实现简单的选项卡效果
Feb 23 Javascript
微信小程序表单验证功能完整实例
Dec 01 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
May 21 Javascript
jQuery中DOM常见操作实例小结
Aug 01 jQuery
在vue中阻止浏览器后退的实例
Nov 06 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
node.js实现快速截图
2016/08/27 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
详解redux异步操作实践
2018/08/15 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
养殖人员的创业计划书范文
2013/12/26 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
中班上学期个人总结
2015/02/12 职场文书
关于迟到的检讨书
2015/05/06 职场文书
酒店温馨提示语
2015/07/14 职场文书
redis 查看所有的key方式
2021/05/07 Redis
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫