前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES6解构嵌套对象

ES6解构嵌套对象

作者头像
IMWeb前端团队
发布2018-01-08 16:09:59
2.2K0
发布2018-01-08 16:09:59
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载

让我们先回忆一下ES6的对象解构,本文介绍各种ES6的对象解构用法,你用过哪一种?

最基本的解构

在对象中提取某个字段

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {name} = user;
console.log(name); //prints: hehe

解构并使用别名

有时接口定义的字段往往带有下划线,但我们的前端更便好于驼峰式命名,那么可以使用别名(rename):

代码语言:javascript
复制
const user = {
  id: 123,
  nick_name: 'hehe'
};
const {nick_name: nickName} = user;
console.log(nickName); //prints: hehe

解构嵌套对象

有时我们会遇到嵌套对象,如果我们了解未足够多时,会写出这种解构:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe',
  education: {
    degree: 'Masters'
  }
};

// 假设我们要提取degree
const {education} = user;
const {degree} = education;

我们会写两行,一层层的剥开,明显繁琐,如果这个对象有三四层结构那简直无法入目。其实可以用解构一步到位的:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe',
  education: {
    degree: 'Masters'
  }
};
const {education: {degree}} = user;
console.log(degree); //prints: Masters

没错,就是比别名方法多了一个{ }

如果没有外层怎么办

假设要解构的数据是由接口返回的,由于某种原因会导致某个字段丢失。我们会往往遇到这种意外:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {education: {degree}} = user;  // TypeError: Cannot match against 'undefined' or 'null'.

这时你是否会觉得还是我们原始的方法好使:

代码语言:javascript
复制
const education = user || {};
const degree = education.degree;

其实,神奇的解构可以让你定义一个缺省值,这样,我们不仅可以达到数据防御的目的,而且告别啰嗦的写法了:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};

const {
    education: {
        degree
    } = {}
} = user;
console.log(degree); //prints: undefined

这明显是一股清流啊。

更深层次的对象怎么办?

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};

const {
    education: {
        school: {
            name
        }
    } = {}
} = user;  // TypeError: Cannot match against 'undefined' or 'null'.

这里外层对education设置缺省值,但里面的school不存在,依然会报错。

我们第一种办法就是继续对school设置缺省值为{}:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name
        } = {}
    } = {}
} = user;
console.log(name); //prints: undefined

另一种办法就是直接给education缺省值设置为{school: {}}:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name
        }
    } = {school: {}}
} = user;
console.log(name); //prints: undefined

这两种方法看似都可以,但如果要给学校名称school.name一个缺省值呢?如果是第一种方法,会写成这样:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name = 'NB'
        } = {}
    } = {}
} = user;
console.log(name); //prints: NB

你数数看,这有多少个“=”号吗?啰嗦得不行,再看第二种方法:

代码语言:javascript
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name
        }
    } = {
        school: {
            name: 'NB'
        }
    }
} = user;
console.log(name); //prints: NB

这样整体给education设置一个缺省值,可读性更强,这又是一股清流。

但是遇到以下这种情况,那第二种情况就有可能报错了(感谢腾爷提供本case):

代码语言:javascript
复制
const user2 = {
  id: 123,
  name: 'hehe',
  education: {}
};
const {
    education: {
        school: {
            name
        }
    } = {
        school: {
            name: 'NB'
        }
    }
} = user2;
console.log(name); // Uncaught TypeError: Cannot match against 'undefined' or 'null'.

这个例子中education 给了一个空对象,因为是非空,这样会导致解构赋默认值失败,除非和接口约定不返回空对象,否则第二种方法也要慎用。

在代码中灵活使用解构不仅可以使代码简洁可读,而且逼格大大提升。

参考资料

[https://medium.com/[@pyrolistical](/user/pyrolistical)/destructuring-nested-objects-9dabdd01a3b8](https://medium.com/[@pyrolistical](/user/pyrolistical%29/destructuring-nested-objects-9dabdd01a3b8)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最基本的解构
  • 解构并使用别名
  • 解构嵌套对象
  • 如果没有外层怎么办
  • 更深层次的对象怎么办?
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档