JavaScript中你不知道的Object.entries用法
作者:GreenTea 发布时间:2024-04-19 11:01:40
目录
前言
1. 使用 for...of 遍历普通对象
2. 普通对象与 Map 对象相互转换
总结
参考
前言
平时我们经常会用到 Object 类上的静态方法,例如 Object.keys 、Object.values 、Object.assign 等等,但可能很少用到 Object.entries 这个方法,这篇文章就来讲解 Object.entries 方法的两个小技巧。
作用
Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。
示例
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
// array like object
const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]
// array like object with random key ordering
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]
// getFoo is property which isn't enumerable
const myObj = Object.create({}, { getFoo: { value() { return this.foo; } } });
myObj.foo = 'bar';
console.log(Object.entries(myObj)); // [ ['foo', 'bar'] ]
// non-object argument will be coerced to an object
console.log(Object.entries('foo')); // [ ['0', 'f'], ['1', 'o'], ['2', 'o'] ]
// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}
// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
1. 使用 for...of 遍历普通对象
很多初学前端的小伙伴可能都写过下面这个代码:
let obj = {
a: 1,
b: 2
}
for (let value of obj) {
// ...
}
但是运行一下就发现,哦吼,报错了:
Uncaught TypeError: obj is not iterable
于是乎,遍历普通对象就变成了清一色的 for...in 遍历。但由于 for...in 不光会遍历对象的自有属性,还会遍历到对象原型上,因此我们在使用的时候还需要加一个过滤,例如:
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
// ...
}
}
可以看到这样写很不优雅。之所以普通对象不能用 for...of 遍历,是因为普通对象没有实现 iterator 接口(关于 JS 的迭代器会专门写一篇文章讲解)。而 JS 数组是实现了 iterator 接口的,因此通过 Object.entries 得到的键值对数组就可以使用 for...of 遍历:
for (let [key, value] of Object.entries(obj)) {
// ...
}
Object.entries 会返回对象自身可枚举属性的键值对数组,不包含原型上的属性
2. 普通对象与 Map 对象相互转换
看到项目中将普通对象转为 Map 对象,还在使用 for...in 遍历:
let obj = {
a: 1,
b: 2
}
let map = new Map();
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
map.set(key, obj[key]);
}
}
实际上 Map 构造器可以接受一个键值对数组初始化,这就意味着可以使用 Object.entries 将普通对象转为 Map 对象:
let map = new Map(Object.entries(obj));
那么 Map 对象如何转回普通对象呢?还使用遍历吗?不需要,可以使用 Object.fromEntries 静态方法来转换:
let obj = Object.fromEntries(map);
说到这里,很多小伙伴可能还是没搞清楚普通对象、键值对数组、Map 对象的转换关系,我用一张图总结一下:
Object.entries 和 Object.fromEntries 是两个相反的操作
参考
Object.entries() - MDN 文档
Map() 构造函数 - MDN 文档
来源:https://juejin.cn/post/7013597375029575717


猜你喜欢
- Haar特征哈尔特征使用检测窗口中指定位置的相邻矩形,计算每一个矩形的像素和并取其差值。然后用这些差值来对图像的子区域进行分类。haar特征
- Pycharm的下方工具栏中有两个窗口:Python Console和Terminal(如下图)其中,Python Console叫做Pyt
- 工作中每天需要收集部门内的FR文件,发送给外部部门的同事帮忙上传,这么发了有大半年,昨天亮光一闪,为什么不做成自动化呢,于是用python实
- FileUpload上传图片(图片不变形) 的实现方法,需要的朋友可以参考下。<style type="text/css&q
- 在SQL Server中,TempDB主要负责供下述三类情况使用:内部使用(排序、hash join、
- 第二次修改models.py以后再次python manage.py makemigrations提示如下You are trying to
- nilGo中,每个指针都有2个基本信息,指针的类型和指针的值(type,value);当执行==时,需要比较类型与值(只有类型与值都相等时,
- API说明调用地址:http://yzxyzm.market.alicloudapi.com/yzx/verifySms请求方式:POST返
- 备份多个数据库可以使用如下命令:mysqldump -uroot -p123456 --databases test1 test2 test
- 做一个简单WPF连接数据库的控件类型和名称:DataGrid:dataGrid &
- 假如有一个数据表A:id name title
- Gittle是一个高级纯python git 库。构建在dulwich之上,提供了大部分的低层机制。Install itpip instal
- 一、图片验证码django-simple-captcha配置1.在pycharm中,File====》Settings====》Projec
- 本文介绍了通过Cursor 工具使用GPT-4的方法。Cursor 是集成了 GPT-4 的 IDE 工具,目前免费并且无需 API Key
- 本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作。分享给大家供大家参考,具体如下:下面的是某一文本文件中的数据。6.11
- 我们使用编辑器的时候,想要在其中添加一个Django项目,这样就能在里面做一些想要的操作。有些人还没有对Django进行安装,这里直接用命令
- 目录一、为什么使用 .gitignore ?二、使用规则2.1 注释2.2 忽略文件(1)忽略文件和目录(2)仅忽略文件2.3 忽略目录2.
- 准备导入的excel为: 可以采用pandas的read_excel功能,具体代码如下:import pandas as pdge
- 1.下载python2.7.xwget https://www.python.org/ftp/python/2.7.6/Python-2.7
- Part 1: 简介在PyTorch中,torch.cat()是一个被广泛使用的函数。它可以让我们在某个维度上把多个张量组合在一起。对于那些