2014-12-07 91 views
1

我一直在通過創建一個二十一點遊戲來自學OOJS。一切都很順利,但由於我隨機創建了卡片,有時我創建並在一輪中處理同一張卡片兩次。我試圖通過編寫一些擺脫重複卡片的邏輯來避免這種情況。這段代碼如何擺脫重複的數組元素?

所以我發現了這個討論。

https://stackoverflow.com/a/840849/945517

和下面的代碼:

function eliminateDuplicates(arr) { 
    var i, 
     len=arr.length, 
     out=[], 
     obj={}; 

for (i=0;i<len;i++) { 
    obj[arr[i]]=0; 
} 
for (i in obj) { 
    out.push(i); 
} 
return out; 
} 

var a=[]; 
var b=[]; 

a[0]="fish"; 
a[1]="fishes"; 
a[2]="fish"; 
a[3]="1"; 
a[4]="fishes"; 

b=eliminateDuplicates(a); 
console.log(a); 
console.log(b); 

我明白這是怎麼回事,一般和幾乎每行不同的是:

for (i=0;i<len;i++) { 
    obj[arr[i]]=0; 
} 

好像它是循環遍歷數組並將obj的鍵設置爲零。這裏發生了什麼,以及如何幫助擺脫開始時傳遞的數組中的重複條目?

謝謝!

+0

(OT)'一個[0] = 「魚」;'拜託不填充陣列那樣! http://jsbin.com/cexoqo/1/edit?html,js,console,output – 2014-12-07 05:34:48

+0

這是示例代碼,而不是我寫的代碼,我知道這不是填充數組的方式。 – heyjohnmurray 2014-12-07 19:17:46

回答

3
{} = {key: value, key2:value2,....} 

上面實質上是一個關鍵的價值圖。代碼遍歷數組,並將鍵值添加到地圖中,值爲零。當地圖試圖訪問現有的值時,它所做的就是將該值重置爲零。無用的操作,但它避免了if..else或其他更復雜的邏輯。

一旦陣列完成被迭代對面,你只需要跨越的關鍵值映射到迭代領取鑰匙。由於密鑰保證是唯一的,因此您有一個唯一項目列表。

+0

所以在我的遊戲中,我將每個玩家卡存儲在玩家獨有的陣列中。所以經銷商有一系列的卡,用戶有一系列的卡。每張卡都是一個包含點值,面值和套裝名稱的對象。在上面的示例中,它正在查看一組字符串。處理我的卡時,原理是否一樣?與此示例中正在做的事情相比,我想要做什麼更困難?如果您出於某種原因想要查看它,我確實很近。 – heyjohnmurray 2014-12-07 05:36:43

+0

Javascript具有簡單和複雜的數據類型。一個對象是一個複雜的數據類型,關鍵是對該對象的引用,而不是變量的值。你這樣做很難,但你一直在學習JavaScript OO原則。您的代碼需要嵌套循環,內部循環具有比較兩張卡片並確定相等的功能。你需要一個if..else,其中發佈的代碼能夠避免它。 – 2014-12-07 05:45:21

1

在這裏實現的主要問題是,一個對象只能有每個唯一的字符串一個屬性,所以當你設置obj.fish 0 i = 0時,你沒有添加第二個「魚」屬性OBJ當i = 2

然後,你可以通過所有obj的屬性的循環,每一個被保證是唯一的,並且因此已剝離重複。