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

标签:js,object.entries
0
投稿

猜你喜欢

  • node.js中的fs.writeFileSync方法使用说明

    2024-05-13 09:29:45
  • Python装饰器语法糖

    2022-07-10 15:11:34
  • mysql 查询当天、本周,本月,上一个月的数据

    2024-01-27 02:10:53
  • 如何用python实现一个HTTP连接池

    2021-10-20 04:52:03
  • 详解python播放音频的三种方法

    2021-12-16 09:19:11
  • pytorch: tensor类型的构建与相互转换实例

    2023-06-14 09:22:57
  • Python调用Fortran的三种形式

    2021-01-10 13:25:08
  • 基于Python实现通过微信搜索功能查看谁把你删除了

    2022-07-10 00:19:37
  • 编写高质量代码的30条黄金守则(首选隐式类型转换)

    2022-07-19 13:03:41
  • SQL Server Bulk Insert 只需要部分字段时的方法

    2011-10-24 19:44:49
  • python+pyqt5编写md5生成器

    2022-03-11 03:06:47
  • Python深度学习神经网络基本原理

    2023-05-08 20:20:32
  • Python 标准库zipfile将文件夹加入压缩包的操作方法

    2021-09-17 14:06:10
  • pytorch 数据加载性能对比分析

    2022-04-17 04:22:22
  • 流动的线条 —— 中国汉字书法之美

    2009-10-30 18:15:00
  • ASP中使用存储过程介绍

    2008-10-10 12:10:00
  • Python数据分析之获取双色球历史信息的方法示例

    2022-10-05 21:16:34
  • python动态监控日志内容的示例

    2022-08-26 18:05:44
  • go语言程序cpu过高问题排查的方法详解

    2024-05-08 10:22:09
  • python 协程 gevent原理与用法分析

    2021-10-12 23:36:19
  • asp之家 网络编程 m.aspxhome.com