Array.prototype.indexOf()

indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
语法:

  1. arr.indexOf(searchElement[, fromIndex])
  • searchElement 要查找的元素
  • fromIndex 可选
    开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
  • 返回值
    首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1

去重方法:

  1. function duplicateRemoval<T>(arr: T[]):T[] {
  2. return arr.filter((item: T, index: number, arr: T[]) => arr.indexOf(item, 0) === index)
  3. }

ES6 - Set 数据结构

  1. function uniqueArr(arr) {
  2. return [...new Set(arr)];
  3. }

双重for循环 + splice

  1. function unique(arr) {
  2. for(let i = 0; i < arr.length; i++) {
  3. for(let j = i + 1; j < arr.length; j++) {
  4. if(arr[i] === arr[j]) {
  5. // 重点代码:第一个等于第二个,使用 splice 方法删除第二个
  6. arr.splice(j, 1)
  7. j--
  8. }
  9. }
  10. }
  11. return arr
  12. }

for循环 + indexOf / includes,返回新数组

reduce + includes

  1. function unique(arr) {
  2. return arr.reduce((prev, cur) => {
  3. if(!prev.includes(cur)) {
  4. prev.push(cur)
  5. }
  6. return prev
  7. }, [])
  8. }
  9. unique([1, 2, 3, 4, 2, 6, 1, 8])

使用哈希表存储元素是否出现过(ES6 - Map)

  1. function unique(arr) {
  2. let map = new Map()
  3. let uniqueArr = [] // 返回结果
  4. for(let i = 0; i < arr.length; i++) {
  5. if(map.has(arr[i])) {
  6. map.set(arr[i], true)
  7. }else {
  8. map.set(arr[i], false)
  9. uniqueArr.push(arr[i])
  10. }
  11. }
  12. return uniqueArr
  13. }
  14. unique([1, 2, 3, 4, 2, 6, 1, 8])

快、慢指针 - TODO