这段代码如何摆脱重复的数组元素?

时间:2014-12-07 05:15:49

标签: javascript

我一直在通过制作二十一点游戏来教自己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的键设置为零。这里发生了什么,这有助于摆脱一开始传递的数组中的重复条目?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

以上基本上是一个关键值图。代码遍历数组并将键添加到映射中,值为零。当地图尝试访问现有值时,它所做的只是将值重置为零。一个无用的操作,但它避免了if..else或其他更复杂的逻辑。

一旦迭代完成数组,您只需遍历键值映射即可获得键。由于密钥保证是唯一的,因此您有一个唯一项目列表。

答案 1 :(得分:1)

这里要实现的主要是对象每个唯一字符串只能有一个属性,因此当i = 0时将obj.fish设置为0时,不要在obj时添加第二个“fish”属性我= 2。

然后你可以循环遍历obj的所有属性,每个属性都保证是唯一的,因此你剥离了重复项。