JavaScript 是弱脚步语言,平时在做Web开发的时候,我们使用方法特别随意,今天这么写,明天可能那么写,过了几天就会忘记曾经的写法。对于对象和数组的遍历,更是如此,有时使用同一种方法遍历,有时又不是。这次特意花了点时间整理一下,来个对象、对象数组遍历大比拼。JavaScript中常用的对象、对象数组遍历方法有以下几种:
-
for...in 循环遍历对象的所有可枚举属性(包括继承来的属性),并将属性名赋值给变量。示例代码:
const myObj = {a: 1, b: 2, c: 3};
对数组对象的遍历:
const myArray = [myObj,myObj,myObj];
运行结果图:
for in 循环遍历,是使用次数最多的遍历。
-
Object.keys() 和 Object.values()
返回对象所有自身可枚举属性的属性名、属性值组成的数组。
示例代码:
const myObj = {a: 1, b: 2, c: 3};
用它俩遍历对象数组,这里就不演示了。这两个方法特别适合key值和value值分别获取的业务场景。
还有两个和Object.keys()功能类似的方法。
2.1、Object.getOwnPropertyNames(),返回对象所有自身属性(包括不可枚举属性)的属性名组成的数组,相当于 Object.keys() 的用法。
示例:
const myObj = {a: 1, b: 2, c: 3};
2.2、Reflect.ownKeys(),返回对象所有自身属性(包括不可枚举属性和Symbol属性)的属性名组成的数组。
示例:
const myObj1 = {a: 1, [Symbol()]: "symbol"};
2.3、扩展一个方法,Object.getOwnPropertyDescriptors(),返回给定对象所有自身属性的描述符。描述符包含可枚举属性、不可枚举属性、数据属性、访问器属性等。
示例:
const myObj2 = {a: 1};
-
Object.entries()
返回对象所有自身可枚举属性的键值对组成的数组。每个键值对都是一个长度为2的数组,第一个元素是属性名,第二个元素是属性值。
示例代码:
const myObj = {a: 1, b: 2, c: 3};
运行结果图
-
Object.entries().map()
返回一个新数组,其中包含对原始数组中的每个元素执行回调函数后的结果。
示例:
const myObj = {a: 1, b: 2, c: 3};
-
Object.entries().forEach()
遍历数组,对象数组,对每个属性执行指定的回调函数。
示例:
const myObj = {a: 1, b: 2, c: 3};
-
for...of 循环
遍历可迭代对象(包括数组、字符串、Map、Set等)中的元素。
示例:
const myObj = {a: 1, b: 2, c: 3};
-
for...await
用于遍历异步可迭代对象中的元素(例如异步生成器)。
示例:
// 异步方法
-
Object.fromEntries()
将一个键值对数组转换为对象。每个键值对都是一个长度为2的数组,第一个元素是属性名,第二个元素是属性值。
示例:
const entries1 = [["a", 1], ["b", 2], ["c", 3]];
股份公司的分公司的分公司电饭锅是对方根深蒂固
-
Object.assign()
将一个或多个源对象的属性复制到目标对象中,如果属性名相同,则后面的属性值会覆盖前面的。示例代码:
const targetObj = {a: 1, b: 2};
最后总结一下,代码中最常用的遍历方法是 for...in。Object.keys() 和 Object.values() 特别适合key值和value值分别获取的场景。Object.entries() 以及扩展出来的Object.entries().map() 、Object.entries().forEach(),可以把它们归为一组。for...of 是 for...in 和 Object.entries() 两个方法的组合。for...await 适用于异步计数器。Object.fromEntries()将键值对转换为数组,Object.assign()将两个对象合并为一个对象,并去重。