JavaScript遍歷JSON所有Key的常用方法總結(jié)
本文介紹了四種遍歷JSON對象屬性的方法:
- for...in循環(huán):最常用,但會遍歷原型鏈屬性
- Object.keys():推薦方法,返回對象自身可枚舉屬性
- Object.entries():同時獲取鍵值對
- Object.getOwnPropertyNames():包含不可枚舉屬性
文內(nèi)還展示了遞歸遍歷嵌套JSON的技巧,并對比了各方法特點。推薦大家日常使用Object.keys()或Object.entries(),它們更安全且語義清晰。對于復(fù)雜嵌套結(jié)構(gòu),可采用遞歸方式深度遍歷所有層級。
for…in 循環(huán)(最常用)
const json = {
name: "張三",
age: 25,
city: "北京"
};
for (let key in json) {
console.log(key); // name, age, city
console.log(json[key]); // 張三, 25, 北京
}
Object.keys()(推薦 ?)
Object.keys(json).forEach(key => {
console.log(key, json[key]);
});
// 或
Object.keys(json).map(key => {
console.log(key);
});
Object.entries()(同時獲取 key 和 value)
for (let [key, value] of Object.entries(json)) {
console.log(`${key}: ${value}`);
}
Object.getOwnPropertyNames()(包括不可枚舉屬性)
Object.getOwnPropertyNames(json).forEach(key => {
console.log(key);
});
遞歸遍歷嵌套 JSON
function traverseKeys(obj, prefix = '') {
for (let key in obj) {
const fullKey = prefix ? `${prefix}.${key}` : key;
console.log(fullKey);
if (typeof obj[key] === 'object' && obj[key] !== null) {
traverseKeys(obj[key], fullKey); // 遞歸
}
}
}
const nestedJson = {
user: {
name: "張三",
address: {
city: "北京",
street: "長安街"
}
}
};
traverseKeys(nestedJson);
// 輸出: user
// user.name
// user.address
// user.address.city
// user.address.street
方法對比
| 方法 | 遍歷原型鏈 | 包含 Symbol | 推薦場景 |
|---|---|---|---|
for...in | ? | ? | 簡單遍歷 |
Object.keys() | ? | ? | 日常推薦 |
Object.entries() | ? | ? | 需要 key+value |
getOwnPropertyNames() | ? | ? | 完整屬性 |
推薦使用 Object.keys() 或 Object.entries(),更安全且語義清晰!
方法補充
在 JavaScript 中,遍歷 JSON(即 JavaScript 對象)的所有 Key 有多種常用方法。下面按照推薦程度和使用場景介紹。
1. Object.keys() – 最常用
返回對象自身可枚舉屬性的 key 數(shù)組,不含原型鏈上的屬性。
const obj = { name: 'Alice', age: 25, city: 'Beijing' };
Object.keys(obj).forEach(key => {
console.log(key, obj[key]);
});
// 輸出: name Alice, age 25, city Beijing2. for...in – 遍歷所有可枚舉屬性(含原型鏈)
for (let key in obj) {
if (obj.hasOwnProperty(key)) { // 過濾掉原型鏈上的屬性
console.log(key, obj[key]);
}
}如果不加 hasOwnProperty 判斷,會遍歷到繼承的屬性(如 toString),通常需要避免。
3. Object.entries() – 同時獲取鍵和值
Object.entries(obj).forEach(([key, value]) => {
console.log(key, value);
});4. Object.getOwnPropertyNames() – 包含不可枚舉屬性
const obj = Object.create({}, {
visible: { value: 1, enumerable: true },
hidden: { value: 2, enumerable: false }
});
Object.getOwnPropertyNames(obj).forEach(key => console.log(key));
// 輸出: visible, hidden (包含不可枚舉的 hidden)5. Reflect.ownKeys() – 包含 Symbol 類型鍵
const sym = Symbol('id');
const obj = { [sym]: 123, name: 'test' };
Reflect.ownKeys(obj).forEach(key => console.log(key, obj[key]));
// 輸出: name test, Symbol(id) 1236. 遍歷嵌套 JSON 的所有 Key(遞歸)
如果 JSON 內(nèi)部還嵌套了對象或數(shù)組,需要遞歸才能獲取所有層級的鍵。
function getAllKeys(obj, prefix = '') {
let keys = [];
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
const fullKey = prefix ? `${prefix}.${key}` : key;
keys.push(fullKey);
const val = obj[key];
if (val && typeof val === 'object') {
keys = keys.concat(getAllKeys(val, fullKey));
}
}
}
return keys;
}
const json = {
user: { name: 'John', address: { city: 'NYC', zip: 10001 } },
active: true
};
console.log(getAllKeys(json));
// 輸出: ['user', 'user.name', 'user.address', 'user.address.city', 'user.address.zip', 'active']| 方法 | 自身可枚舉 | 自身不可枚舉 | 原型鏈 | Symbol |
|---|---|---|---|---|
Object.keys() | ?? | ? | ? | ? |
for...in | ?? | ? | ??(需過濾) | ? |
Object.getOwnPropertyNames() | ?? | ?? | ? | ? |
Reflect.ownKeys() | ?? | ?? | ? | ?? |
日常遍歷普通 JSON 對象,Object.keys() 是最簡單、最推薦的方法。 如果需要同時獲取值,使用 Object.entries()。如果需要包含不可枚舉或 Symbol 鍵,再考慮另外兩種。
到此這篇關(guān)于JavaScript遍歷JSON所有Key的常用方法總結(jié)的文章就介紹到這了,更多相關(guān)JavaScript遍歷JSON所有Key內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
快速解決select2在bootstrap模態(tài)框中下拉框隱藏的問題
今天小編就為大家分享一篇快速解決select2在bootstrap模態(tài)框中下拉框隱藏的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
AngularJs中Bootstrap3 datetimepicker使用實例
這篇文章主要為大家詳細(xì)介紹了AngularJs中Bootstrap3 datetimepicker使用實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
webpack+express實現(xiàn)文件精確緩存的示例代碼
這篇文章主要介紹了webpack+express實現(xiàn)文件精確緩存的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
JavaScript函數(shù)的一些注意要點小結(jié)及js匿名函數(shù)
本文給大家總結(jié)了javascript函數(shù)的一些注意要點及js匿名函數(shù),主要知識點有:函數(shù)的基本語法、函數(shù)的參數(shù)、函數(shù)的重載相關(guān)知識,對本文感興趣的朋友一起學(xué)習(xí)吧2015-11-11

