HOWTO · JavaScript
獲取 JavaScript 物件的鍵
本教程詳細介紹瞭如何在 javascript 中獲取物件的鍵。
本頁內容
使用 Object.keys(obj) 可取得物件自身可列舉的字串屬性名稱陣列。若需要讓每個鍵與其值保持配對,請使用 Object.entries(obj)。這兩種方法都不會變更物件。若使用迴圈也要走訪繼承而來的可列舉屬性,請使用 for...in;若任務需要只處理自身屬性,再加上篩選。
使用 Object.keys() 取得物件的鍵
Object.keys() 會回傳物件自身可列舉的字串鍵陣列。當屬性名稱事先未知時,例如處理 API 回傳的記錄,這個方法就很實用。回傳的陣列只有名稱;要讀取值,請使用 obj[key]。如果物件沒有自身可列舉的字串屬性,結果會是空陣列。符號屬性不會列入其中。
屬性的順序有明確規則,但不一定等同於鍵的寫入順序。陣列索引鍵(從 0 到 4294967294 的標準整數索引字串)會先依數值由小到大排列。其他字串鍵則依屬性建立順序排列。像 "01" 這樣的字串不是陣列索引,因此會與其他一般字串鍵排在一起。陣列也遵循相同規則:Object.keys() 會以字串形式回傳目前存在且可列舉的索引鍵,不會回傳陣列值。
執行以下範例:
const record = { 4: 'pear', 2: 'mango', name: 'fruit', '01': 'label' };
const keys = Object.keys(record);
console.log(keys);
console.log(record[keys[0]]);
console.log(Object.keys(['red', 'blue']));
這個範例會先列出數值索引鍵,再列出其他字串;"01" 會留在一般字串鍵之中,並示範如何使用回傳的鍵查找其值。取得鍵不會重新排序或改寫 record 中的屬性。
使用 Object.entries() 取得物件的鍵和值
當下一步需要同時使用每個鍵及其對應的值時,請使用 Object.entries(obj)。它會回傳由二元素陣列組成的陣列,形式如 [[key, value], ...]。與 Object.keys() 相同,它只包含物件自身可列舉的字串屬性、使用相同的屬性順序,也會排除符號屬性。若某個值本身是物件,它不會遞迴走訪該物件。
使用解構賦值可以方便地處理每一組鍵值。以下完整範例會為每個屬性印出標籤和值;範例中的標籤文字維持英文:
const settings = { theme: 'dark', language: 'English' };
for (const [key, value] of Object.entries(settings)) {
console.log(`${key}: ${value}`);
}
如果只需要名稱,請選擇 Object.keys();如果迴圈需要同時取得名稱和值,請選擇 Object.entries()。若已知鍵的名稱,就不必列舉整個物件,直接使用 settings.theme 或 settings['theme'] 存取值即可。
使用 for…in 迴圈走訪物件的鍵
for...in 迴圈會走訪可列舉的字串屬性。它也可能包含透過物件原型繼承而來的屬性,因此結果可能與只列出自身屬性的 Object.keys() 不同。若要排除繼承屬性,請在迴圈中使用 Object.hasOwn(obj, key)。這個方法適用於現代 JavaScript;較舊的環境則可使用 Object.prototype.hasOwnProperty.call(obj, key)。
const parent = { category: 'fruit' };
const item = Object.create(parent);
item.name = 'mango';
for (const key in item) {
if (Object.hasOwn(item, key)) {
console.log(`${key}: ${item[key]}`);
}
}
迴圈可能會遇到自身的 name 和繼承而來的 category,但自身屬性檢查只會印出 name。若要取得所有可列舉屬性,請省略這項檢查。若要以可預期的方式列出物件自身可列舉的字串鍵,通常使用 Object.keys() 最清楚。
列舉只會處理一層。若頂層屬性的值是另一個物件,鍵清單只會包含該頂層屬性的名稱,而它的值仍是那個巢狀物件。若要列出巢狀鍵,請另外對該值呼叫 Object.keys();遞迴走訪則需要額外邏輯來逐一處理每個巢狀物件。請依照需要的屬性選擇這三種方式:Object.keys() 取得名稱,Object.entries() 取得名稱和值的配對,而 for...in 走訪原型鏈上的可列舉屬性。