2011-11-15 119 views
2

我正在使用'jQuery.unique()'函數將不同的數組值從一個數組放入另一個數組,但第二個數組中的值似乎不包含不同的值。jQuery.unique()不返回完全不同的值

var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126']; 
uniqueArray = $j.unique(nonuniqueArray); 
alert (uniqueArray); 

值警告是:AMI:29126,AMI:31591,AMI:29126,AMI:8244

我注意到,如果陣列中的類似值組合在一起,然後正常工作,爲e.g如果「AMI:29126」被組合在一起,它似乎確定。

對上述代碼有什麼問題的任何建議是最受歡迎的。

很多很多的感謝:)

回答

3

這裏是你如何能有規則排列的方法做到這一點,但我要指出的indexOf()是一個較新的陣列方法和韓元在IE7或更早版本中無法使用,但可輕鬆複製1個循環

var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126']; 

function distinctVal(arr){ 
    var newArray = []; 
    for(var i=0, j=arr.length; i<j; i++){ 
     if(newArray.indexOf(arr[i]) == -1) 
       newArray.push(arr[i]); 
    } 
    return newArray; 
} 

var uniqueArray = distinctVal(nonuniqueArray); 
alert(uniqueArray); 
1

您不能使用字符串數組jQuery的unique方法。它只適用於DOM元素的數組。從docs

排除DOM元素的數組,適當位置,刪除重複項。 請注意,這隻適用於DOM元素數組,而不是字符串或 數字。

+0

啊,是的,我明白了。感謝您的信息 – tanya

4

的$ .unique爲此請參見以下URL不進行:http://api.jquery.com/jQuery.unique/

的$ .unique()函數通過對象的數組搜索,排序 陣列,以及移除任何重複節點。 此功能僅在DOM元素的普通JavaScript數組上使用 ,主要在jQuery內部使用 。

你可以做的是先排序,然後使用獨特的,這不完全是它的地方,但它的工作原理。

var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126']; 
var sortedArray = Array.sort(nonuniqueArray); 
var unique = $.unique(sortedArray); 

$.each(unique , function(k, v){ 
    $("div").append(v + "<br />"); 
}); 

結果:

AMI:8244 
AMI:31591 
AMI:29126 

現場演示:http://jsfiddle.net/9x4dR/

+0

謝謝.. :)你節省了我的時間。 –

0

此處是一個比Marlin的解決方案更高效和兼容的樣本。 indexOf是大型陣列有點貴查找,所以字符串是最好創建一個臨時對象:

function strUnique(arr) { 
    var obj = {}, 
     ret = [], 
     i = arr.length; 

    while (i--) { 
     if (!obj[arr[i]]) { 
      obj[arr[i]] = true; 
      ret.unshift(arr[i]); 
     } 
    } 

    return ret; 
} 

如果順序很重要,你可能想轉發工作,而不是倒退。如果是這樣,你需要相應地調整循環。

0

在ES6你可以做這樣的事情:

Array.prototype.unique = function() { 
    let newArray = []; 
    for(let i=0, j=this.length; i<j; i++){ 
     if(newArray.indexOf(this[i]) == -1) newArray.push(this[i]); 
    } 
    this.splice(0, this.length, ...newArray); 
} 

只憑yourarray.unique()運行它(它的工作原理就地)。如果你不使用ES6,你可以用下面的代碼替換這個:this.splice(0, this.length, ...newArray);(我沒有在下面測試這個代碼):

this.splice(0, this.length) 
for(el of newArray) { this.push(el) }