了解indexOf和lastIndexOf

时间:2019-12-05 10:09:12

标签: javascript arrays filter indexof 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

现在,我rec了一下脑袋,试图了解为什么该解决方案有效,但我仍然不明白。 有人可以向我解释吗? 预先感谢。

2 个答案:

答案 0 :(得分:6)

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

例如:

const arr = [1,2,3,4,4,5,6,6]

console.log(arr.indexOf(5))
console.log(arr.lastIndexOf(5))

由于这两个函数都返回相同的索引,因此filter会将元素保留在其中。

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

const arr = [1,2,3,4,4,5,6,6]

console.log(arr.indexOf(4))
console.log(arr.lastIndexOf(4))

我回答的问题与您解决的问题here类似,您也可以尝试这种逻辑。

答案 1 :(得分:2)

除了需要大量迭代数组的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]))

相关问题