如何在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的独特元素。
返回值是测试我等于找到的元素的索引,所以函数返回将是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);
将总是返回其下元件已经在阵列中被发现的第一个索引,所以只有第一任何副本将经滤波的阵列中被接受。
我喜欢你解释行为的方式。简明扼要地给出一个完整的解释。 – davidxxx
var uniqueArray = arr1.filter(function(elem,i,rep){
return i == rep.indexOf(elem);
})
这里ELEM将包含阵列的每个元素,我将当前ELEM的索引和代表将包含整个阵列
现在rep.indexOf(ELEM);将始终给出该元素的第一次出现的索引现在Array.prototype.filter()以一种方式工作,如果返回true,则不会过滤它,但如果返回false,则会将其过滤出来,以便每个元素除了第一次出现会从你的例子滤除
array.filter(功能(CurrentValue的,索引,ARR),thisValue)
在.filter
方法中,所述功能遍历每个索引并使用indexOf
找到你所说的:“首次出现的索引。”
在迭代期间,索引i
遇到重复的元素,并且使用测试来查看此i
是否等于给定数组中的当前元素的索引。
的过滤器()方法创建填充有通过测试(作为函数提供的)所有的数组元素的数组。
在你的例子中的测试是i == rep.indexOf(elem);
。
当迭代达到索引2
时,元素为a
。然而,元素a
的第一次出现在索引1
。此时,i=2
但是rep.indexOf(elem) = 1
。测试返回false
,因为2==1
是false
。
此false
返回从新创建的数组中排除索引2
处的重复元素a
。
'var uniqueArray = [... new Set(arr1)];' – baao