JavaScript中如何遍歷對(duì)象(方法匯總)
今天來點(diǎn)稍微輕松的話題,如何在JavaScript中遍歷對(duì)象,在平常的工作中,遍歷對(duì)象是很常見的操作,javascript提供了多種方法來遍歷對(duì)象的屬性。這些方法各有特點(diǎn),不同的場(chǎng)景需要使用不同的方法。
假設(shè)我們有一個(gè)Person對(duì)象,包含名字和年齡兩個(gè)屬性,下面看看有哪些方式可以遍歷這個(gè)對(duì)象。
const person = {
name: 'Philip',
age: 18,
};for...in
遍歷對(duì)象最基本的方式就是使用for...in,這里需要注意區(qū)分和for...of的區(qū)別。
for...in- 遍歷可枚舉對(duì)象,比如Object。for...of- 遍歷可迭代對(duì)象,比如Array。
在以下代碼中,key是每個(gè)屬性的名字 - 對(duì)應(yīng)name和age,而person[key]則是每個(gè)屬性的值 - 對(duì)應(yīng)Philip和18。
for (const key in person) {
console.log(key, person[key]);
}輸出如下:
name Philip
age 18
for...in是遍歷對(duì)象最基本的方式,需要注意的是它不僅會(huì)遍歷對(duì)象自身的屬性,也會(huì)遍歷原型鏈上的屬性。假設(shè)我們?cè)?code>Object.prototype上添加一個(gè)屬性,那么這個(gè)屬性也會(huì)被遍歷到。
Object.prototype.customProperty = 'Hello World';
for (const key in person) {
console.log(key, person[key]);
}輸出如下:
name Philip
age 18
customProperty Hello World
如果你只想遍歷對(duì)象自身的屬性,可以使用Object.hasOwnProperty方法來過濾掉原型鏈上的屬性。
for (const key in person) {
if (person.hasOwnProperty(key)) {
console.log(key, person[key]);
}
}使用for...of + Object.keys
Object.keys方法返回一個(gè)對(duì)象中所有可枚舉屬性的鍵名并放到一個(gè)數(shù)組里,配合for...of可以很方便地遍歷對(duì)象的屬性。
for (const key of Object.keys(person)) {
console.log(key, person[key]);
}使用for...of + Object.values
如果你只關(guān)心對(duì)象的值,而不在key的話,那么可以使用Object.values方法,它返回一個(gè)包含對(duì)象所有可枚舉屬性值的數(shù)組。
for (const value of Object.values(person)) {
console.log(value);
}輸出如下:
Philip
18
for...of + Object.entries
下面的方法使用for...of進(jìn)行遍歷,我們都知道for..of是用來遍歷可迭代對(duì)象的,所以Object.entries返回的一定是一個(gè)可迭代對(duì)象 - 這里是一個(gè)二維數(shù)組,然后[key, value]是一個(gè)解構(gòu)操作,負(fù)責(zé)解構(gòu)內(nèi)層一維數(shù)組中的值并輸出。
for (const [key, value] of Object.entries(person)) {
console.log(key, value);
}Object.entries(person)輸出如下,可以看作是一個(gè)鍵值對(duì)組成的二維數(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
一個(gè)更加函數(shù)式的寫法是使用數(shù)組對(duì)象上的forEach方法。
Object.entries(person).forEach(([key, value]) => {
console.log(key, value);
});forEach本質(zhì)上和for...of并無區(qū)別,在使用鏈?zhǔn)讲僮鲿r(shí),這種方式可讀性更好,比如和filter等方法串聯(lián)調(diào)用時(shí)。
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
如果你的對(duì)象中有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會(huì)報(bào)錯(cuò),具體原因可以看這篇:
好了最后用表格總結(jié)一下:
| 方法 | 包含繼承屬性 | 包含Symbol | 包含不可枚舉屬性 | TypeScript支持 |
|---|---|---|---|---|
for...in | ? | ? | ? | 需要索引簽名 |
Object.keys() | ? | ? | ? | ? |
Object.values() | ? | ? | ? | ? |
Object.entries() | ? | ? | ? | ? |
Reflect.ownKeys() | ? | ? | ? | ? |
到此這篇關(guān)于JavaScript中如何遍歷對(duì)象的文章就介紹到這了,更多相關(guān)JavaScript遍歷對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JS?for?in遍歷對(duì)象順序不對(duì)解決辦法
- javaScript遍歷對(duì)象和數(shù)組的方法總結(jié)
- JS中輕松遍歷對(duì)象屬性的幾種方式
- JS 5種遍歷對(duì)象的方式
- JS中如何輕松遍歷對(duì)象屬性的方式總結(jié)
- js/jquery遍歷對(duì)象和數(shù)組的方法分析【forEach,map與each方法】
- JS遍歷對(duì)象屬性的方法示例
- js中遍歷對(duì)象的屬性和值的方法
- JS遍歷數(shù)組和對(duì)象的區(qū)別及遞歸遍歷對(duì)象、數(shù)組、屬性的方法詳解
- JS遞歸遍歷對(duì)象獲得Value值方法技巧
相關(guān)文章
javascript實(shí)現(xiàn)base64 md5 sha1 密碼加密
本篇文章給大家介紹了javascript實(shí)現(xiàn)密碼加密,通過base64、md5、sha1文件,調(diào)用相關(guān)方法實(shí)現(xiàn)密碼加密,非常簡(jiǎn)單,需要的朋友可以參考下2015-09-09
Bootstrap框架結(jié)合jQuery仿百度換膚功能實(shí)例解析
這篇文章主要為大家詳細(xì)介紹了Bootstrap框架結(jié)合jQuery仿百度換膚功能實(shí)現(xiàn)代碼解析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
JavaScript在Android的WebView中parseInt函數(shù)轉(zhuǎn)換不正確問題解決方法
這篇文章主要介紹了JavaScript在Android的WebView中parseInt函數(shù)轉(zhuǎn)換不正確問題解決方法,因轉(zhuǎn)換的字符串?dāng)?shù)字都以0開頭,導(dǎo)致parseInt函數(shù)在瀏覽器和Android WebView中轉(zhuǎn)換結(jié)果不一樣,本文給出了解決方法,需要的朋友可以參考下2015-04-04
document節(jié)點(diǎn)對(duì)象的獲取方式示例介紹
如果要操作一個(gè)元素,首先要獲取到它,下面為大家介紹下document節(jié)點(diǎn)對(duì)象的獲取方式,感興趣的朋友不要錯(cuò)過2013-12-12
Javascript利用canvas繪制兩點(diǎn)間曲線和箭頭
這篇文章主要為大家詳細(xì)介紹了Javascript如何利用canvas實(shí)現(xiàn)在兩點(diǎn)間繪制曲線和矩形,并且在矩形中繪制文字,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
微信小程序scroll-view實(shí)現(xiàn)滾動(dòng)到錨點(diǎn)左側(cè)導(dǎo)航欄點(diǎn)餐功能(點(diǎn)擊種類,滾動(dòng)到錨點(diǎn))
這篇文章主要介紹了微信小程序scroll-view左側(cè)導(dǎo)航欄點(diǎn)餐功能實(shí)現(xiàn),點(diǎn)擊種類,滾動(dòng)到錨點(diǎn);滾動(dòng)到錨點(diǎn),種類選中,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

