选择嵌套_如何优雅地在JavaScript中访问嵌套对象

ce877b5d818dfb77f86bda917a346bb0.png

在JavaScript中访问嵌套对象

以超酷的方式安全地访问JavaScript中的嵌套对象

JavaScript是惊人的,我们都知道。但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼界。其中一个问题是当您尝试访问嵌套对象时与此错误的对抗,

无法读取未定义的属性'foo'

大多数情况下,当我们使用JavaScript时,我们将处理嵌套对象,并且通常我们需要安全地访问最里面的嵌套值。

我们以此嵌套对象为例。

const user = { id: 101, email: 'jack@dev.com', personalInfo: { name: 'Jack', address: { line1: 'westwish st', line2: 'washmasher', city: 'wallas', state: 'WX' } }}

要访问我们用户的名字,我们会写

const name = user.personalInfo.name;const userCity = user.personalInfo.address.city;

这很简单直接。

但是,由于某种原因,如果我们用户的个人信息不可用,那么对象结构将是这样的。

const user = { id: 101, email: 'jack@dev.com'}

现在,如果您尝试访问该名称,您将被抛出 无法读取未定义的属性“名称”

const name = user.personalInfo.name; // Cannot read property 'name' of undefined

这是因为我们试图name 从不存在的对象访问 密钥。

大多数开发人员处理这种情况的常用方法是

const name = user && user.personalInfo ? user.personalInfo.name : null;// undefined error will NOT be thrown as we check for existence before access如果您的嵌套结构很简单,这是可以的,但是如果您的数据嵌套了5或6级,那么您的代码看起来会非常混乱let city;if ( data && data.user && data.user.personalInfo && data.user.personalInfo.addressDetails && data.user.personalInfo.addressDetails.primaryAddress ) { city = data.user.personalInfo.addressDetails.primaryAddress;}

处理这种混乱的对象结构有一些技巧。

Oliver Steele的嵌套对象访问模式

这是我个人最喜欢的,因为它使代码看起来 干净简单。我从stackoverflow中选择了这种风格,一旦你理解它是如何工作的,它就非常吸引人了。

const name = ((user || {}).personalInfo || {}).name;

使用这种表示法,您将永远不会遇到 无法读取未定义的属性“名称”。你基本上检查用户是否存在,如果没有,你动态创建一个空对象。这样,下一级键将 始终从存在的对象或空对象访问,但永远不会从未定义。

不幸的是, 您无法使用此技巧访问嵌套数组

使用Array Reduce访问嵌套对象

Array reduce方法非常强大,可用于安全地访问嵌套对象。

const getNestedObject = (nestedObj, pathArr) => { return pathArr.reduce((obj, key) => (obj && obj[key] !== 'undefined') ? obj[key] : null, nestedObj);}// pass in your object structure as array elementsconst name = getNestedObject(user, ['personalInfo', 'name']);// to access nested array, just pass in array index as an element the path array.const city = getNestedObject(user, ['personalInfo', 'addresses', 0, 'city']);// this will return the city from the first address item.

Typy

https://github.com/flexdinesh/typy

如果您认为上述方法过于主流,那么您应该尝试 我编写的Typy库。除了安全地访问嵌套对象之外,它还有许多令人敬畏的东西。

它以npm包的形式提供 - Typy

如果您使用 Typy,您的代码将如下所示

import t from 'typy';const name = t(user, 'personalInfo.name').safeObject;const city = t(user, 'personalInfo.addresses[0].city').safeObject;// address is an array

编辑:还有一些像Lodash和Ramda这样的其他库可以做到这一点。但是在轻量级的前端项目中,特别是如果你只需要这些库中的一两种方法,最好选择替代轻量级的lib,或者更好,自己编写。

快乐'安全地访问JavaScript中的嵌套对象'!

链接:https://javascriptkicks.com/articles/236734/accessing-nested-objects-in-javascript

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迭代器 java_百战程序员:Java设计模式之迭代器模式

迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了&…

postman-常见问题解决方案记录

1、 Response body:Containing string为中文 Response body:Containing string:为中文时,转换为unicode编码,并添加转义符。 2、get方式与post请求使用环境变量 post方式请求,请求体中包含有环境变量,引用方法: JSON格…

批发电脑配件_2019年10月电脑配件表

当前电脑主要配件的批发价,不面向零售哦!下面给大家介绍一下想获得详细报价,持续为您更新想了解电脑系统重装请回复:重装系统电脑由于windows10更新卡顿请回复:windows 10笔记本电脑购买常识请回复:笔记本电…

uniapp光标自动定义到文本框_word如何自动生成毕业论文目录!

一篇word文档,内容有大的章,小的节。如何把章节抽出来生成目录?WORD →点击需要插入的地方 → 插入菜单 → 索引和目录 → 目录 → 确定目录通常是长文档不可缺少的部分,有了目录,用户就能很容易地知道文档中有什么内容…

计算机基础word-常见问题

问题1:艺术字样式不一致,为: 不是原来的: 解决方案:将原来word 文件-另存为-保存类型为:Word97-2003文档,重新打开即可。 问题2:word分栏 第一栏没满,第二栏有内容。 解…

d3.js 旋转图形_MATLAB 的图形处理

一基本绘图函数1. 平面曲线绘图plot(Y) 如Y是实向量,则绘出横坐标值为序号,纵坐标值为Y的曲线,如Y是虚数,则横坐标值为Y的实部,纵坐标为Y的虚部的曲线,点与点之间用线段相连。如果Y是矩阵,则画出…

顺序查找-判断质数/记录出现次数

描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现…

iphone录屏没内部声音_安卓手机如何录屏?手机高清录屏指南

安卓手机如何录屏?师兄最近迷上了玩输出,输出战绩可以说是可圈可点。有时候想要炫耀下自己的战况,操作的时候截屏不方便。部分小伙伴的手机截图过后还需要编辑或者左滑图片,图片也不能展示自己优秀的操作!其实录屏的方…

表变量是什么_DAX学习:使用VAR定义变量

前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法。VAR是VARIABLE的缩写,意思为变量,任何一个编程语言中,变量都是一个非常重要的基础概念,…

手机连接电脑 不显示android phone

百度各种办法,下载各种驱动。结果,结果: 竟然是在设备管理器中-右击-显示隐藏的设备类型。 androidd phone显示啦。。 花费了一晚上的时间。。。。

苹果隐藏app_iOS 14的隐藏功能盘点:不知道等于白更新!

iOS 14的更新已经过去一阵子了,相信大家都被改变桌面布局、修改充电提示音等五花八门的功能吸引了。但小黑今天要和大家说一说,那些iOS 14中隐藏的功能,这些功能并没有在更新中提到,但个个都好用!声音识别功能日常生活中,我们对每种不同声音的识别算是基本操作了,但对于手机而言…

unittest-常见问题解决方案记录

1、没有报错,但显示run 0 tests 解决方案:查看测试用例是否以test开头 2、命名为test-01,导包错误 解决方案:python文件夹命名不能使用中划线,修改中划线为下划线,即可导包正确。 3、代码运行成功,显示…

svn冲突怎么解决_管理者怎么处理员工冲突?解决下属冲突的6个方法

公司、部门、项目组,多么优秀的团队都无法避免内部冲突,职场冲突是一种常见的职场现象,这种冲突不仅会给团队和个人带来的重大的影响。那么团队出现了冲突,是不是就不会继续向前了呢?答案是否定的,只要管理…

modbus tcp主站和从站_【智】S7200PLC与台达变频器MODBUS轮询实时读取详解

大家好,我是微控小智,今天又跟大家见面了。学习不是一蹴而就,需要坚持,做技术亦是如此,厚积才能博发。上次分享的S7-200PLC与台达VFD_M变频器Modbus通讯案例程序,是采用SM0.5时钟脉冲接通MODBUS指令&#x…

华为gsm模块_出货量全球第一,华为阿里腾讯都是其客户,上海移远通信牛在哪?...

近些年来,我们明显感受到了科技进步带来的便捷,微信支付、支付宝付款早已经成为绝大多数人的支付方式;交水费、电费等再也不用去缴费大厅排队,手机就能一键实现;出门也不怕迷路了,滴滴出行、手机地图等让你…

判别两棵树是否相等 设计算法_一文看懂生成对抗网络 - GANs?(附:10种典型算法+13种应用)...

生成对抗网络 – GANs 是最近2年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频。我们手机里的照片处理软件中就会使用到它。本文将详细介绍生成对抗网络 – GANs 的设计初衷、基本原理、10种典型算法和13种实际应用。GANs的设计初衷一句…

sql语句 int(11)含义误区

使用sql中 int(11)存储手机号错误!!!! 这些类型,是定长的,其容量是不会随着后面的数字而变化的,其值的范围是确定的。 比如int(11)和int(8),都是一样的占4字节。tinyint(1)和tinyin…

python保存图片到指定路径_使用Python将不同大小照片制作为GIF动画2

导读:本文介绍如何使用Python将不同大小的照片制作为GIF动画,文末附源代码。阅读完本文,你将学会使用Python编写程序,将不同大小的照片制作为心仪的GIF动画。在上一篇文章里,介绍了使用Python和imageio,不改…

GitHub访问慢-FastGithub下载及使用

很多需要用到的脚本及软件会先发布在GitHub上,所以经常需要访问GitHub,但是每次都会卡在跳转到GitHub的步骤,就是还没开始就可以结束了。 之前尝试过手动修改host文件来解决网站的访问问题 以及更换网络但还是有时候无法如愿的访问GitHub Fa…

android r 编译找不到头文件_「投稿」iOS逆向——砸壳与反编译

作者:疯狂的蛋神近来对iOS逆向十分感兴趣,就在业余时间里自己在上网找了各种资料学习,发现许多资料对于一些细节描述的不够详细,所以也踩了很多坑,我也将自己踩的一些坑总结出来,希望对大家有所帮助。注&am…