HOWTO · JavaScript

JavaScript 中的字典長度

本文演示瞭如何在 JavaScript 中查詢字典的長度。

本頁內容

在 JavaScript 中,字典通常以物件表示,物件的屬性會將鍵對應至值。若要取得字典的長度,請先決定要計算哪些屬性:JavaScript 物件沒有內建的 length 屬性,因此一般會計算物件自有且可列舉的字串鍵屬性數量。陣列則不同:陣列有內建的 length 屬性,用來表示其索引元素的長度。

JavaScript 中物件的長度代表什麼?

物件可以有自有屬性、繼承屬性、可列舉或不可列舉的屬性,以及以 Symbol 為鍵的屬性。物件沒有單一的內建長度可以涵蓋所有這些屬性。對一般字典而言,計算自有且可列舉的字串鍵是實用的預設做法。以下方法都採用相同的計算範圍,而 for...in 則需要檢查屬性是否為自有屬性,才能排除繼承而來的可列舉鍵。

使用 Object.keys() 計算自有且可列舉的字串鍵

若只需要數量或鍵清單,Object.keys(object).length 是簡潔的選擇。Object.keys() 會回傳一個陣列,其中包含物件自有、可列舉且以字串為鍵的屬性名稱;該陣列的 length 就是計數結果。繼承屬性、Symbol 鍵及不可列舉的屬性都不會納入計算。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const dictionary = {
  name: "John",
  age: 30,
  city: "New York"
};

console.log(Object.keys(dictionary).length);

這個運算式會計算此物件中的三個鍵。此處提供的是程式碼,沒有附上執行輸出。若物件沒有任何自有且可列舉的字串鍵,計數結果會是 0;因此,若要檢查這類字典是否為空,可以寫成 Object.keys(dictionary).length === 0。

需要鍵值配對時使用 Object.entries()

Object.entries(object).length 計算的範圍與 Object.keys(object).length 相同,也就是物件自有、可列舉且以字串為鍵的屬性。不同之處在於,Object.entries() 會回傳由 [key, value] 配對組成的陣列。若後續步驟需要鍵和值,例如格式化每筆項目或轉換值,就適合使用這個方法;若只需要數量,Object.keys() 更能直接表達目的。

例如,給定 { name: "Alice", age: 25 },其項目概念上會是 [["name", "Alice"], ["age", 25]],而項目陣列有兩個元素。這是在說明回傳資料的結構,並未宣稱這是實際執行結果。

使用 for…in 迴圈計算屬性

for...in 迴圈會走訪物件本身及其原型鏈上的可列舉字串鍵。若要計算與上述方法相同的自有屬性數量,請對每個鍵加上檢查。呼叫 Object.prototype.hasOwnProperty.call() 比呼叫 object.hasOwnProperty(key) 安全:物件可能有名為 hasOwnProperty 的自有屬性,遮蔽原本的方法。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const dictionary = { name: "Bob", age: 40, city: "Chicago" };
let count = 0;

for (const key in dictionary) {
  if (Object.prototype.hasOwnProperty.call(dictionary, key)) {
    count++;
  }
}

console.log(count);

這個迴圈會計算自有且可列舉的字串鍵,並跳過繼承而來的可列舉鍵。精確保留的術語 hasOwnProperty 指的是此處使用的屬性所有權檢查。若需要在走訪每個鍵時執行操作,可以使用迴圈;否則,Object.keys() 或 Object.entries() 通常更容易閱讀。

選擇適合的方法並處理常見情況

若要直接計數,或同時需要鍵,請選擇 Object.keys(object).length。若除了數量也需要鍵值配對,請選擇 Object.entries(object)。若周邊程式邏輯適合手動走訪,則可使用加上檢查的 for...in 迴圈。這些方法說明了計數範圍,但無法據此對所有物件或工作負載做出效能排名。

巢狀物件在其父物件中仍只算一個屬性。例如,{ user: { name: "Sam" } } 只有一個頂層鍵 user;計算 user 內部的鍵是另一項操作。若要遞迴計數,必須明確定義要走訪哪些巢狀值;這些方法不會自動遞迴計數。

陣列已有 array.length,表示其索引長度,也可能包含尚未指定值的位置。相較之下,Object.keys(array).length 計算的是陣列自有且可列舉的字串鍵;若陣列有空位或額外屬性,它就不能取代陣列長度。計算陣列長度時使用內建屬性,計算字典型物件的屬性數量時則使用物件鍵方法。