2012-08-28 89 views
0

我需要在重新洗牌後刪除重複項。目前結果出來重複。Array刪除重複結果Javascript

實施例:結果2,2,1,4,4,3,5,5,我需要如2,1,4,3,5

這是一個大陣列

<script> 
Array.prototype.shuffle = function() { 
var input = this; 

for (var i = input.length-1; i >=0; i--) { 

    var randomIndex = Math.floor(Math.random()*(i+1)); 
    var itemAtIndex = input[randomIndex]; 

    input[randomIndex] = input[i]; 
    input[i] = itemAtIndex; 

} 
return input; 
} 

var tempArray = [ 

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 

2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 

3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 

4,4,4,4,4,4,4,4,4,4,4,4,4, 

5,5,5,5,5, 
] 

tempArray.shuffle(); 

document.write(tempArray); 

</script> 
+0

你爲什麼不洗牌之前將其刪除? – Bergi

+0

@MarkF請點擊旁邊的複選標記以選擇最佳的答案。它有很多幫助。 – 0x499602D2

+0

我仍然無法將其刪除重複。你可以把你的代碼放入我的腳本中以確保我正確地將它放入我的腳本中嗎? –

回答

3

而不是使用該大型陣列,只需使用[1,2,3,4,5].shuffle()即可。這樣,你不會得到重複。但這裏有一個功能,會給你一個獨特的陣列,即陣列時不重複:

function unique(arr) { 
    var result = [], 
     map = {}; 
    for (var i = 0; i < arr.length; i++) { 
    var duplicate = map[arr[i]]; 
    if (!duplicate) { 
     result.push(arr[i]); 
     map[arr[i]] = true; 
    } 
    } 
    return result; 
} 

然後,只需使用unique(tempArray.shuffle())

這是DEMO

+0

我需要使用所有的數字。他們是加權的。 –

+0

@MarkF:我已經更新了我的答案,您可以使用'unique()'刪除重複項。 –

+0

謝謝我在看完你的演示代碼後得到它的工作 –

2
function unique(b) { 
    for (var c = [], d = {}, a = 0; a < b.length; a++) { 
     d[b[a]] || (c.push(b[a]), d[b[a]] = !0); 
    } 
    return c; 
} 

unique([1, 1, 1, 2, 2, 3]); // [1, 2, 3] 
+0

您是否真的認真對待João的答案? – Ryan

+0

不,我自己縮小了。我知道它有相同的功能名稱和一切。我應該改變它嗎? – 0x499602D2

+0

不,不用擔心,只是想知道(他們在Google Closure編譯器中編譯的時候是一樣的)。 – Ryan

0

如果你有機會到jQuery的,你可以在過程中,通過把它拆分成兩個陣列,採取這一結果,循環,只有它,如果它不是已經在那裏添加到newArray。這樣他們按照相同的順序出來。

var someArray = [3,3,3,3,3,3,4,4,4,4,1,1,1,1,1,2,2]; 

function cleanArray(oldArray) { 
    var newArray = []; 
    for(i=0;i<oldArray.length;i++) { 
     if($.inArray(oldArray[i], newArray) == -1) { 
      newArray.push(oldArray[i]);   
     } 
    } 
    return newArray; 
} 

document.write(cleanArray(someArray)); 
//result would be 3,4,1,2 

編輯:我已經更新的功能,所以它的作品,我相信你想象的方式。這裏有一個工作示例:http://jsfiddle.net/xe2F8/

另外,不要忘了鏈接到jQuery的:從任何JavaScript數組刪除重複的

<script src="http://code.jquery.com/jquery-latest.js"></script> 
+0

你假設jQuery – Lior

+1

你是對的,jQuery在這一點上是如此無處不在,我認爲大多數人會使用它+當他們看到它時會識別$ ...但這並非總是如此(也沒有$ === jQuery)...所以我不應該假設,thnx的編輯。 – Nick

+0

如何使用document.write調用函數 –

0

一個真正快速的方法如下:

var listWithDuplicates = [1, 2, 2, 4, 3, 4, 5, 3, 1, 5]; 
console.log(listWithDuplicates.filter(function(element, index, array) { 
    // using lastIndexOf(...) retains the last 
    // repetition preserving the order of the array 
    return index === array.indexOf(element); 
})); 
//prints out: [1, 2, 4, 3, 5] - with indexOf variant 
//prints out: [2, 4, 3, 1, 5] - with lastIndexOf variant 

希望這適用於與刪除JavaScript數組中的重複相關的某些用途。

請分享有關本解決方案未解決的任何拐角案例的反饋或有關改進此答案的任何建議。

1

您可以用下面的辦法,使用ES6語法:const unique = [...new Set(array)]

更多關於設置對象: Mozilla - Set object