从数组中删除重复项(了解代码)

时间:2016-07-29 15:56:36

标签: javascript arrays

我正在查看练习并且无法理解以下内容的工作方式(我试图从数组中删除重复项)

var arr = ['a','b','c','a','b','d','e','f'];
var uniqueArray = arr.filter(function(item,pos){
   return arr.indexOf(item) == pos; 
});

我尝试理解

此处item接受arr中的所有值。让我们进行一次迭代 First item = 'a'pos = 0。好。现在我们只想根据'a'的索引是否与0

相同来进行过滤

此处indexOf(a) == 0

大!这是真的,让我们把它放在新的数组中。

现在让我们再前往我们再次看到的地方,即pos = 3

arr.indexOf(a) == 3

等等......这是否符合我们的要求?这怎么会删除重复?

3 个答案:

答案 0 :(得分:1)

indexOf只返回一个整数值,它是第一个找到的项的索引。因此,当pos为3(并且itema)时,indexOf将返回0(因为a的第一个索引为0),{ {1}}为false,元素将被删除。

然后,当0==3为4(且positem)时,b返回2,即找到的第一个indexOf的索引。< / p>

对于对象,它们不能有重复的键。每个新密钥都会自动覆盖旧密钥,因此不会有任何重复。

查找

b

答案 1 :(得分:1)

nicael是对的。 indexOf(item)只是一个遍历数组的函数,它会在数组中第一次查找item,并返回数组中的位置。在您的示例中,如果a位于0且a位于索引3处,则indexOf('a')将返回位置0,而pos的值为3,因此filter返回false。

关注:

indexOf()有另一个名为fromIndex的参数,它允许您从数组开头以外的位置开始搜索。在这种情况下,您可以通过执行'a'来指定跳过第一次arr.indexOf('a', 1),这会在位置1处开始搜索,而不是0.在这种情况下,函数将从下一个{{返回true]返回true 1}}位于第3位。

我可以在对象上使用过滤器吗?

不,因为filter是Array对象的特定功能。您可以通过在'a'上执行过滤来获取对象的键,因为keys()返回一个数组。

使用您的示例:

Object.keys(myObject)

答案 2 :(得分:-1)

Hashtable是消除冗余值的最佳方法 这是代码:

char arr[] = ['a','b','c','a','b','d','e','f'];
//it will contains all 26 places as zero (A - Z)
char hashArray[26]={0} 
int i; //for iteration;

for(i=0;arr[i]!='\0';i++)
{
  //it will subtracte the ascii value of the letter 
  //from 'a' so that we have the values from 0 to 26)
  hashArray[arr[i]-'a']=arr[i]; 
}

for(i=0;i<26;i++)
{
   if(hashArray[i]!=0) //to Ensure the positon has the character
   {
      printf("%c",hashArray[i]); 
   } 
}