我一直在通过制作二十一点游戏来教自己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 :(得分:3)
{} = {key: value, key2:value2,....}
以上基本上是一个关键值图。代码遍历数组并将键添加到映射中,值为零。当地图尝试访问现有值时,它所做的只是将值重置为零。一个无用的操作,但它避免了if..else或其他更复杂的逻辑。
一旦迭代完成数组,您只需遍历键值映射即可获得键。由于密钥保证是唯一的,因此您有一个唯一项目列表。
答案 1 :(得分:1)
这里要实现的主要是对象每个唯一字符串只能有一个属性,因此当i = 0时将obj.fish设置为0时,不要在obj时添加第二个“fish”属性我= 2。
然后你可以循环遍历obj的所有属性,每个属性都保证是唯一的,因此你剥离了重复项。