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 相关文章推荐
推荐一些非常不错的javascript学习资源站点
Aug 29 Javascript
零基础学JavaScript最新动画教程+iso光盘下载
Jan 22 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
JavaScript面向对象程序设计教程
Mar 29 Javascript
移动适配的几种方案(三种方案)
Nov 25 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
Angular4学习笔记router的简单使用
Mar 30 Javascript
socket io与vue-cli的结合使用的示例代码
Nov 01 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
vue中进行微博分享的实例讲解
Oct 14 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
jquery更改元素属性attr()方法操作示例
May 22 jQuery
解决使用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取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
详细介绍Python语言中的按位运算符
2013/11/26 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
Python装饰器知识点补充
2018/05/28 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
财会专业毕业生自荐信
2014/07/09 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL