可以直接使用的代碼:錯新站長站修正版 [Ctrl+A 全選 注:如需引入外部Js需刷新才能執行] 下面是進階教程與說明,喜歡跟深入的朋友可以參考下。 首先讓我們看下 YUI 是如何處理的: 代碼如下: var toObject = function(a) { var o = {}; for (var i = 0; i < a.length; i = i+1) { o[a[i]] = true; } return o; }; var keys = function(o) { var a=[], i; for (i in o) { if (lang.hasOwnProperty(o, i)) { // YUI的方法 a.push(i); } } return a; }; var uniq = function(a) { return keys(toObject(a)); }; 詳細分析,見同事 長天 的分享 《巧妙去除數組中的重復項》。 自己使用的方式與 YUI 的方式十分相似,不過僅使用了一次循環便完成了刪除數組中重復項,如下: 代碼如下: var uniq = function (arr) { var a = [], o = {}, i, v, len = arr.length; if (len < 2) { return arr; } for (i = 0; i < len; i++) { v = arr[i]; if (o[v] !== 1) { a.push(v); o[v] = 1; } } return a; } 經過了簡單的測試:自己使用的方式性能遠遠高于 YUI 的方式。 拋磚引玉,歡迎大家提供更好的處理方法。 2009年12月28日更新: 以上兩種函數方法暫時都不能處理復雜的含有混合類型的數組(感謝 小貓 提出的疑問),如:[0,"0",1,"1",0]、["null",null]。 對于能夠約定類型為數字(注:要求非0開頭的數字,小數除外)或字符串的數組,我們可以用改進后的函數方法(感謝 closurecache 提供的思路): 代碼如下: var uniq = function (arr) { var a = [], o = {}, i, v, cv, // corrected value len = arr.length; if (len < 2) { return arr; } for (i = 0; i < len; i++) { v = arr[i]; /* closurecache 提供的函數中使用的是 cv = v + 0;, * 這樣就無法辨別類似[1, 10, "1", "10"]的數組, * 因為運算后 => 1, 10, 10, 100,很明顯,出現了重復的標示符。 * 加前面就難道沒問題嗎? * 有的:數組中不能出現類似01 、001,以 0 開頭的數字, * 但適用性比原先更廣。 */ cv = 0 + v; if (!o[cv]) { a.push(v); o[cv] = true; } } return a; } 如果大家想在此解題思路的基礎上,更完美一點,推薦 Dexter.Yy 的方法,進行類型判斷,給予唯一標示符,詳見 評論 20 樓。 沒有最好,只有最合適的方式,其實使用 Array.indexOf() 的思路也是不錯的選擇,對于已經支持的瀏覽器直接用原生的 Array.indexOf() 方法,對于未支持的,我們增加 Array.indexOf() 方法,如下: