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

JavaScript 數組去重:避開 splice 返回值陷阱

     編輯:程式設計綜合問答

問題代碼分析


var tmp = arr.splice(0,1); // splice 返回【被刪除元素組成的數組】,如 [1]
arr1.push(tmp);            // arr1 變為 [[1]],二維數組
if (tmp != arr1[0]) ...    // 比較兩個不同數組對象,永遠為 true

根因

  • splice 返回**新數組**,而非單個元素值。
  • JavaScript 中數組/對象比較的是**引用地址**,內容相同但非同一對象結果為 false。

正確去重寫法(ES6 推薦)


// 1. Set 去重(最簡潔)
function unique(arr) { return [...new Set(arr)]; }

// 2. filter + indexOf(兼容舊環境)
function unique(arr) {
    return arr.filter((item, index) => arr.indexOf(item) === index);
}

// 3. reduce + 對象哈希(高性能)
function unique(arr) {
    return arr.reduce((acc, cur) => {
        if (!acc.map.has(cur)) { acc.map.set(cur, true); acc.arr.push(cur); }
        return acc;
    }, {map: new Map(), arr: []}).arr;
}

測試


console.log(unique([1,2,'abc',1,3,'abc'])); // [1, 2, 'abc', 3]

採用 Set 或 filter 等現代 API,代碼簡潔、語義清晰、避免手動循環陷阱。

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