任何人都可以解释Filter和IndexOf方法在函数中如何协同工作吗?

时间:2017-07-21 13:29:21

标签: javascript

我有以下功能,它几乎完成了它应该做的事情,但我想确切地了解它在循环的每个步骤上做了什么。

请您查看下面的函数并给我一个明确的解释,评论每个步骤或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();

2 个答案:

答案 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()方法在数组中搜索指定的项目,并返回其位置。”