我具有以下功能,该功能几乎可以实现预期的功能,但是我想确切地了解它在循环的每个步骤中的功能。

您能否看一下下面的函数,并给我一个清晰的解释,注释每个步骤或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();

最佳答案

indexOf返回数组中元素的first索引:

[1,2,2,3].indexOf(2); // 1


因此,如果在示例中使用filter到元素的第二次出现,则索引(示例中的i)将不等于indexOf返回的值并被删除。在我的数组中,第二个2上方的位置2显然不严格等于indexOf返回的位置2。

[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.


最终结果是,所有重复元素将从filter返回的副本中删除。并且它是一个副本,原始数组未突变。

编辑

我可能应该提到,JavaScript的最新版本为我们提供了更好的方法:

let arrayWithDupes = [1,2,2,3];
let uniq = Array.from(new Set(arrayWithDupes)); // [1,2,3]

关于javascript - 谁能解释在一个函数中Filter和IndexOf方法如何一起工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45238972/

10-13 00:53