2011-12-17 60 views
4
var arr1 = [12,'ss','sdd','sdd','kk']; 
function unique(array){ 
    var o = {},b = []; 
    for(var i=0;i<array.length;i++){ 
    if(!o[array[i]]){ 
     b.push(array[i]); 
     o[array[i]] = true; 
    } 
    } 
    return b; 
} 
unique(arr1) //It works fine .output [12,'ss','sdd','kk'] 

but,it has some issues on arr2 below: 

var arr2 = [12,'ss','sdd','sdd','kk','12'];//output [12,'ss','sdd','kk'] 

它是否出錯?我認爲應該輸出[12,'ss','sdd','kk','12'],我們可以修復這個問題嗎?關於Javascript Array獨特

+0

逗號變種後`I = 0`應該是分號。 – 2011-12-17 10:12:43

+0

我已經修復了分號。 – 2011-12-17 10:17:46

回答

3

按鍵名稱總是轉換爲字符串。我建議使用Array.prototype.indexOf來檢查數組條目是否唯一。 indexOf方法對於對象[1]也表現正確。

演示:http://jsfiddle.net/YE9jx/

function unique(array){ 
    var b = []; 
    for(var i=0; i<array.length; i++){ 
    if(b.indexOf(array[i]) == -1) b.push(array[i]); 
    } 
    return b; 
} 

[1]正確的行爲是:如果不同的對象的引用是不同的:

var obj1 = [1,2]; 
var obj2 = [1,2]; 
unique([obj1, obj2]); //[[1,2], [1,2]] // Because they're different arrays 
unique([obj1, obj1]); //[[1,2]]   // Because both elements are obj1 
1

當數12作爲字典鍵,晉升爲字符串,使其成爲相同的密鑰作爲最後一個字符串'12'