首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 陣列去重核心邏輯深度解析

     編輯:程式設計綜合問答

面試高頻考點:使用物件(或 Map/Set)實現陣列去重。本文逐行拆解經典 unique 函式,幫助理解「為何這樣寫能去重」。

原始碼

function unique(arr) {
    var obj = {};
    var uniAfter = [];
    for (var i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
            uniAfter.push(arr[i]);
            obj[arr[i]] = 1;
        }
    }
    return uniAfter;
}

逐行執行流程圖解

假設輸入 arr = [1, 2, 2, 3, 1]:

迴圈輪次arr[i]obj[arr[i]] 當前值!obj[arr[i]] 結果動作obj 狀態uniAfter 狀態
01undefinedtruepush 1, obj[1]=1{1:1}[1]
12undefinedtruepush 2, obj[2]=1{1:1, 2:1}[1,2]
221false略過{1:1, 2:1}[1,2]
33undefinedtruepush 3, obj[3]=1{1:1, 2:1, 3:1}[1,2,3]
411false略過{1:1, 2:1, 3:1}[1,2,3]

關鍵點解析

  1. 物件屬性存取特性:obj[key] 若不存在回傳 undefined,在 if 判斷中為 falsy;賦值後為 1(truthy),再次遇到同值時 !1 === false,達到去重。
  2. 鍵值自動轉字串:物件鍵名皆為字串,arr[i] 會隱式轉字串。故 1 與 "1" 視為相同,{} 與 [] 也會轉為 "[object Object]" 導致誤判,不適合含物件/陣列的複雜資料。
  3. 時間複雜度 O(n):單次遍歷,物件查找 O(1),優於雙層迴圈 O(n²)。

現代寫法(ES6+)

// Set 去重(不保證順序,但現代引擎保持插入順序)
const unique = arr => [...new Set(arr)];

// Map 保留首次出現順序,支援任意類型鍵值
const unique = arr => {
    const seen = new Map();
    return arr.filter(item => !seen.has(item) && seen.set(item, 1));
};

適用場景與限制

  • ✅ 適用:基本型別(數字、字串、布林、null、undefined)組成的陣列。
  • ❌ 不適用:陣列元素為物件、陣列、函式等引用型別(需自定義比較邏輯或序列化鍵值)。
  • ⚠️ 注意:NaN 在物件鍵中會被轉為 "NaN",可正常去重;+0 與 -0 視為相同。

理解底層機制,才能在面對變體需求(如保留最後一次出現、自定義比較器)時靈活改寫,而非死記硬背。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved