今天來點(diǎn)稍微輕松的話題,如何在JavaScript中遍歷對象,在平常的工作中,遍歷對象是很常見的操作,javascript提供了多種方法來遍歷對象的屬性。這些方法各有特點(diǎn),不同的場景需要使用不同的方法。
假設(shè)我們有一個Person
對象,包含名字和年齡兩個屬性,下面看看有哪些方式可以遍歷這個對象。
const person = {
name: 'Philip',
age: 18,
};
for...in
遍歷對象最基本的方式就是使用for...in
,這里需要注意區(qū)分和for...of
的區(qū)別。
for...in
- 遍歷可枚舉對象,比如Object
。for...of
- 遍歷可迭代對象,比如Array
。
在以下代碼中,key
是每個屬性的名字 - 對應(yīng)name
和age
,而person[key]
則是每個屬性的值 - 對應(yīng)Philip
和18
。
for (const key in person) {
console.log(key, person[key]);
}
輸出如下:
name Philip
age 18
for...in
是遍歷對象最基本的方式,需要注意的是它不僅會遍歷對象自身的屬性,也會遍歷原型鏈上的屬性。假設(shè)我們在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
方法返回一個對象中所有可枚舉屬性的鍵名并放到一個數(shù)組里,配合for...of
可以很方便地遍歷對象的屬性。
for (const key of Object.keys(person)) {
console.log(key, person[key]);
}
使用for...of
+ Object.values
如果你只關(guān)心對象的值,而不在key的話,那么可以使用Object.values
方法,它返回一個包含對象所有可枚舉屬性值的數(shù)組。
for (const value of Object.values(person)) {
console.log(value);
}
輸出如下:
Philip
18
for...of
+ Object.entries
下面的方法使用for...of
進(jìn)行遍歷,我們都知道for..of
是用來遍歷可迭代對象的,所以Object.entries
返回的一定是一個可迭代對象 - 這里是一個二維數(shù)組,然后[key, value]
是一個解構(gòu)操作,負(fù)責(zé)解構(gòu)內(nèi)層一維數(shù)組中的值并輸出。
for (const [key, value] of Object.entries(person)) {
console.log(key, value);
}
Object.entries(person)
輸出如下,可以看作是一個鍵值對組成的二維數(shù)組。
[[name, 'Philip'], [age, 18]]
使用[key, value]
進(jìn)行解構(gòu)后正好得到兩組數(shù)據(jù):
key = name, value = 'Philip' // 第一組數(shù)據(jù)
key = age, value = 18 // 第二組數(shù)據(jù)
Object.entries
+ forEach
一個更加函數(shù)式的寫法是使用數(shù)組對象上的forEach
方法。
Object.entries(person).forEach(([key, value]) => {
console.log(key, value);
});
forEach
本質(zhì)上和for...of
并無區(qū)別,在使用鏈?zhǔn)讲僮鲿r,這種方式可讀性更好,比如和filter
等方法串聯(lián)調(diào)用時。
Object.entries(person)
.filter(([key, value]) => key !== 'age') // 過濾掉 age 屬性
.forEach(([key, value]) => console.log(key));
還有一點(diǎn)要注意,那就是forEach
是無法中斷的,比如不能使用continue
或者break
來中斷循環(huán),但是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
會報錯,具體原因可以看這篇:
好了最后用表格總結(jié)一下:
方法 | 包含繼承屬性 | 包含Symbol | 包含不可枚舉屬性 | TypeScript支持 |
---|
for...in | ? | ? | ? | 需要索引簽名 |
Object.keys() | ? | ? | ? | ? |
Object.values() | ? | ? | ? | ? |
Object.entries() | ? | ? | ? | ? |
Reflect.ownKeys() | ? | ? | ? | ? |
轉(zhuǎn)自https://www.cnblogs.com/graphics/p/18972113
該文章在 2025/7/9 14:52:31 編輯過