2014-12-07 95 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的属性的循环,每一个被保证是唯一的,并且因此已剥离重复。