Understanding indexOf and lastIndexOf



我正在做一些JavaScript练习,我偶然发现了这个"编写一个JavaScript程序来过滤掉数组中的非唯一值"。

我尝试并找到了一个解决方案,它有效,但它很麻烦。根据该网站的说法,更好的答案如下:

const filter_Non_Unique = arr =>
arr.filter(l => arr.indexOf(l) === arr.lastIndexOf(l));
console.log(filter_Non_Unique([1,2,3,4,4,5,6,6])) // 1,2,3,5

现在我脑子里想明白为什么这个解决方案有效,但我仍然不明白。 有人可以向我解释吗? 提前谢谢。

如果元素在数组中只出现一次,则第一个索引将与最后一个索引相同,则两次调用的索引都不会更改。

例如:

const arr = [1,2,3,4,4,5,6,6]
console.log(arr.indexOf(5))
console.log(arr.lastIndexOf(5))

由于这两个函数返回相同的索引,因此过滤器将保留元素。

另一方面,如果有多个值,这些值将具有不同的索引,因此过滤器将返回 false,并将其从数组中删除:

const arr = [1,2,3,4,4,5,6,6]
console.log(arr.indexOf(4))
console.log(arr.lastIndexOf(4))

我已经回答了一个类似于你在这里解决的问题,你也可以试试这个逻辑。

除了需要大量迭代数组的indexOf/lastIndexOf方法之外,您还可以采用双循环方法。

通过使用哈希表和三种状态获取单个项目的数组,例如

  • undefined,对象未声明属性的标准值,
  • true对于第一个找到的值,
  • false数组中重复的所有值。

然后按哈希表的值进行筛选。

const
filterNonUnique = array => {
var hash = {};
for (let v of array) hash[v] = hash[v] === undefined;
return array.filter(v => hash[v]);
}
console.log(filterNonUnique([1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 7]))

最新更新