如何在JavaScript中使用indexOf和filter()

问题描述:

这是我发现的代码作为这个问题的答案:编写一个JavaScript程序以从数组中删除重复项(忽略大小写敏感)。如何在JavaScript中使用indexOf和filter()

var arr1=[3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3, 'A']; 

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 
console.log(uniqueArray); 

我知道什么过滤器()不和的indexOf用来查找元素中第一次出现的索引,但我不明白怎么这行:

i == rep.indexOf(elem); 

只介绍uniqueArray的独特元素。

+0

'var uniqueArray = [... new Set(arr1)];' – baao

返回值是测试我等于找到的元素的索引,所以函数返回将是true或false。

根据MDN的约01​​文章:

的的indexOf()方法返回在该给定的元件 可以在阵列中可以发现,或-1,如果它不存在的第一个索引。

在代码中你已经呈现:

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 

在过滤器的回调变量i是数组中的当前项目的索引。如果项目的外观不止一个,则当前索引(i)和Array#indexOf返回的索引在第一个之后的重复值不同。在这种情况下,过滤器回调将返回false,并且重复的值将被过滤掉。

i == rep.indexOf(elem); 

将总是返回其下元件已经在阵列中被发现的第一个索引,所以只有第一任何副本将经滤波的阵列中被接受。

+0

我喜欢你解释行为的方式。简明扼要地给出一个完整的解释。 – davidxxx

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 

这里ELEM将包含阵列的每个元素,我将当前ELEM的索引和代表将包含整个阵列
现在rep.indexOf(ELEM);将始终给出该元素的第一次出现的索引现在Array.prototype.filter()以一种方式工作,如果返回true,则不会过滤它,但如果返回false,则会将其过滤出来,以便每个元素除了第一次出现会从你的例子滤除

w3schools

array.filter(功能(CurrentValue的,索引,ARR),thisValue)

.filter方法中,所述功能遍历每个索引并使用indexOf找到你所说的:“首次出现的索引。”

在迭代期间,索引i遇到重复的元素,并且使用测试来查看此i是否等于给定数组中的当前元素的索引。

w3schools

的过滤器()方法创建填充有通过测试(作为函数提供的)所有的数组元素的数组。

在你的例子中的测试是i == rep.indexOf(elem);

当迭代达到索引2时,元素为a。然而,元素a的第一次出现在索引1。此时,i=2但是rep.indexOf(elem) = 1。测试返回false,因为2==1false

false返回从新创建的数组中排除索引2处的重复元素a