JavaScript中如何遍历对象?
JavaScript中如何遍历对象?
今天来点稍微轻松的话题,如何在JavaScript中遍历对象,在平常的工作中,遍历对象是很常见的操作,javascript提供了多种方法来遍历对象的属性。这些方法各有特点,不同的场景需要使用不同的方法。
假设我们有一个Person对象,包含名字和年龄两个属性,下面看看有哪些方式可以遍历这个对象。
const person = {
name: 'Philip',
age: 18,
};
for...in
遍历对象最基本的方式就是使用for...in,这里需要注意区分和for...of的区别。
for...in- 遍历可枚举对象,比如Object。for...of- 遍历可迭代对象,比如Array。
在以下代码中,key是每个属性的名字 - 对应name和age,而person[key]则是每个属性的值 - 对应Philip和18。
for (const key in person) {
console.log(key, person[key]);
}
输出如下:
name Philip
age 18
for...in是遍历对象最基本的方式,需要注意的是它不仅会遍历对象自身的属性,也会遍历原型链上的属性。假设我们在Object.prototype上添加一个属性,那么这个属性也会被遍历到。
Object.prototype.customProperty = 'Hello World';
for (const key in person) {
console.log(key, person[key]);
}
输出如下:
name Philip
age 18
customProperty Hello World
如果你只想遍历对象自身的属性,可以使用Object.hasOwnProperty方法来过滤掉原型链上的属性。
for (const key in person) {
if (person.hasOwnProperty(key)) {
console.log(key, person[key]);
}
}
使用for...of + Object.keys
Object.keys方法返回一个对象中所有可枚举属性的键名并放到一个数组里,配合for...of可以很方便地遍历对象的属性。
for (const key of Object.keys(person)) {
console.log(key, person[key]);
}
使用for...of + Object.values
如果你只关心对象的值,而不在key的话,那么可以使用Object.values方法,它返回一个包含对象所有可枚举属性值的数组。
for (const value of Object.values(person)) {
console.log(value);
}
输出如下:
Philip
18
for...of + Object.entries
下面的方法使用for...of进行遍历,我们都知道for..of是用来遍历可迭代对象的,所以Object.entries返回的一定是一个可迭代对象 - 这里是一个二维数组,然后[key, value]是一个解构操作,负责解构内层一维数组中的值并输出。
for (const [key, value] of Object.entries(person)) {
console.log(key, value);
}
Object.entries(person)输出如下,可以看作是一个键值对组成的二维数组。
[[name, 'Philip'], [age, 18]]
使用[key, value]进行解构后正好得到两组数据:
key = name, value = 'Philip' // 第一组数据
key = age, value = 18 // 第二组数据
Object.entries + forEach
一个更加函数式的写法是使用数组对象上的forEach方法。
Object.entries(person).forEach(([key, value]) => {
console.log(key, value);
});
forEach本质上和for...of并无区别,在使用链式操作时,这种方式可读性更好,比如和filter等方法串联调用时。
Object.entries(person)
.filter(([key, value]) => key !== 'age') // 过滤掉 age 属性
.forEach(([key, value]) => console.log(key));
还有一点要注意,那就是forEach是无法中断的,比如不能使用continue或者break来中断循环,但是for...in和for...of则不受此限制。
Reflect.ownKeys
如果你的对象中有Symbol类型的属性,那么可以使用Reflect.ownKeys方法来获取所有属性的键名。
const person = {
name: 'Philip',
age: 18,
[Symbol('id')]: 123,
};
Reflect.ownKeys(person).forEach(key => {
console.log(key, person[key]);
});
输出如下:
name Philip
age 18
Symbol(id) 123
Reflect.ownKeys是遍历Symbol类型属性的唯一方法。
最后,如果你使用的是TypeScript,那么所有使用了索引操作的遍历方式(比如person[key])都需要添加索引签名,否则TypeScript会报错,具体原因可以看这篇:
好了最后用表格总结一下:
| 方法 | 包含继承属性 | 包含Symbol | 包含不可枚举属性 | TypeScript支持 |
|---|---|---|---|---|
for...in |
需要索引签名 | |||
Object.keys() |
||||
Object.values() |
||||
Object.entries() |
||||
Reflect.ownKeys() |
今天就到这里了,今天是我生日,感谢大家的支持,我们明天见!
JavaScript中如何遍历对象?的更多相关文章
- JavaScript中的事件对象
JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...
- JavaScript中创建字典对象(dictionary)实例
这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- 简单使用JSON,JavaScript中创建 JSON 对象(一)
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...
- JavaScript中的window对象
JavaScript中的window对象:http://www.cnblogs.com/kissdodog/archive/2013/01/01/2841464.html
- js:JavaScript中的ActiveXObject对象
JavaScript中的ActiveXObject对象作用: https://blog.csdn.net/pl1612127/article/details/77862174
- 详解javascript中的this对象
详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...
- javascript中如何获取对象名
javascript中如何获取对象名 一.总结 一句话总结:将对象传入参数,看参数是否为函数(js中的对象和函数是一个意思么(函数肯定是对象)),对象参数.name属性即可获得 //版本4 funct ...
- JavaScript中的global对象,window对象以及document对象的区别和联系
JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...
- 【JavaScript】JavaScript中的ActiveXObject对象
JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用. 使用方法: newObj = new ActiveXObject( servername.t ...
随机推荐
- python 入门专辑资料整理学习
Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持极简主义. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC 软件 ...
- 第一次3D打印,一个简单的小方块(rhino)
一.建模 打开犀牛,我们选择立方体 我们点击上册的中心点 输入0,然后回车0 而后我们输长度:10,回车确认 同样的,宽度10 高度同样是10 回车确认后,我们得到一个正方形 二.导出模型 我们选择文 ...
- 🎯Vercel-从零到上线的云端部署神器
简介 Vercel是一个专注于前端和全栈应用部署的云端平台,由Zeit公司开发.它以零配置部署.全球CDN加速和对主流框架的深度支持为核心优势,成为开发者快速上线项目的首选工具.无论是个人博客.企业官 ...
- 为啥有好多人说 Arduino 是玩具?
作为一个在嵌入式领域摸爬滚打近十年的老兵,我不得不说这个问题触动了我的神经.每次听到有人说"Arduino只是个玩具",我都忍不住想反驳,但冷静下来思考后,我发现这个问题并不是非黑 ...
- element ui select组件 实现鼠标悬浮 自动展开选项
利用鼠标悬浮事件: 同样的原理也可以设置鼠标移开自动关闭
- 最火向量数据库Milvus安装使用一条龙!
向量数据库是大模型应用开发必备组件之一,因为它在知识库.语义搜索.检索增强生成(RAG)等人工智能应用中发挥着举足轻重的作用.但向量数据有很多,为什么要使用 Milvus 呢? 常见向量数据 常见的向 ...
- StarBlog和Masuit.MyBlogs博客程序学习使用日记(二)
使用中发现管理平台的博客列表无法查看,发现是echarts.min.js引用路径无效,找到route.config.js之后找到对应的菜单配置项修改对应的路径为https://cdn.staticfi ...
- 前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 在前端开发的浩瀚海洋中,寻找一款既能提升开发效率,又能保证界面美观的 UI 组件库,犹如大海 ...
- 解决get和post请求提交数据中文乱码问题
目录 get请求乱码 乱码案例 解决办法 方法一:进行转码 方法二:修改tomcat中conf/server.xml post请求乱码 解决办法:在取参数之前设置编码格式 get请求乱码 Tomcat ...
- packer 学习笔记
前言 网上有一个老哥用 packer 制作镜像的博客里开篇就提到[1]. Failure is success in progress. -- Albert Einstein 不要害怕失败,在用 pa ...