我有以下功能,它几乎完成了它应该做的事情,但我想确切地了解它在循环的每个步骤上做了什么。
请您查看下面的函数并给我一个明确的解释,评论每个步骤或Filter和IndexOf方法?
非常感谢你。
var arr = [6,2,6,8,9,9,9,4,5];
var unique = function(){
return arr.filter(function(e, i, a) {
return i === a.indexOf(e);
})
}
unique();
答案 0 :(得分:2)
indexOf
返回数组中元素的first索引:
[1,2,2,3].indexOf(2); // 1
因此,如果您在示例中使用filter
时遇到元素的第二次出现,则索引(示例中为i
)将不等于{{1}返回的值并被删除。在上面的数组中,第二个2位于第2位,显然不等于indexOf
返回的位置。
indexOf
最终结果是从[1,2,2,3].filter((value, index, array) => array.indexOf(value) === index);
// first iteration: value is 1, index is 0, indexOf is 0 0===0 keep 1
// second: value is 2, index is 1, indexOf is 1, 1===1 keep 2
// third: value is 2, index is 2, indexOf is 1, 1===2 false! toss 2
// etc.
返回的副本中删除了任何重复元素。它是一个副本,原始数组没有变异。
我应该提一下,最新版本的JavaScript为我们提供了更好的方法:
filter
答案 1 :(得分:0)
如果记录的值如下:
var arr = [6,2,6,8,9,9,9,4,5];
var unique = function(){
return arr.filter(function(e, i, a) {
console.log('e: ' + e);
console.log('i: ' + i);
console.log('a: ' + a);
return i === a.indexOf(e);
})
}
var unq = unique();
console.log(unq);
你会得到:
"e: 6"
"i: 0"
"a: 6,2,6,8,9,9,9,4,5"
依旧......
e =数组中的当前元素,i =数组的索引,a =数组源;
Filer函数:“filter()方法创建一个数组,其中包含所有传递测试的数组元素(作为函数提供)。”
indexOf:“indexOf()方法在数组中搜索指定的项目,并返回其位置。”