数组去重的简单实现

90 阅读1分钟

如何用Set实现数组去重?

var arr = [1,2,2,3,3,3,4,4]
const uniq = function(a) {
    // new Set得到值的集合
    // 然后将值的之和变成数组
    return Array.from(new Set(a))
    // return [...new Set(a)]  // 也可以用展开运算法转化成数组
}
const arr2 = uniq(arr)
arr2 // [1,2,3,4]

image.png

用记数排序的方式实现数组去重

let arr = [1,1,2,2,2,3,3,3,4,4,4,4,4,]
var uniq = function(a) {
    var obj = {}
    //遍历数组a,让obj拥有不重复的key
    for(let i = 0;i<a.length;i++) {
        // 得到数组中各索引的值
        let number = a[i] // 以上的arr为例,那么值就是1,2,3,4
        // 判断number是否为obj对象的属性
        if(number in obj) {
            // 如果number已经是它的属性了,那么就直接进行下一个循环
            continue
        }
        // 把number作为obj的key,设置为true
        obj[number] = true
    }
    const result = []
    // for-in遍历obj,得到obj的key
    for(let key in obj) {
        // 把这些独一无二的key,push到result数组中
        result.push(key)
    }
    return result
}

这样做的缺点是什么?

  • 只能变成字符串
  • 如果既有数组,又有字符串,那么也是分不出来的(会将它们合二为一)

用记数排序跟Map实现数组去重

let arr = [1,,,,'2',1,2,2,2,3,3,3,4,4,4,4,4,]
var uniq = function(a) {
    var map = new Map()
    for(let i = 0; i<a.length; i++) {
        let number = a[i]
        // 如果map中已经有number这个key
        if(map.has(number)) {
            // 进入下一个循环
            continue
        }
        // 给map设置属性,key为number
        map.set(number,true)
    }
    // 得到map中的所有key,然后将它们用展开运算符转化成数组
    return [...map.keys()]
}
uniq(arr)

用filter跟Map实现数组去重

function uniqueFunc(arr) {
  const map = new Map();
  // map.has判断map中是否有某个key
  // map.set为map中设置一个key(键名与键值)
  // 如果map中没有item作为key,那么就为map添加一个key,这个key就是item,要传入的键值随意,写1也可以
  return arr.filter((item) => !map.has(item) && map.set(item, true));
}

其他知识

Set

  • 作用是什么

    • Set对象是值的集合,你可以按照插入的顺序迭代它的元素。
    • Set 中的元素只会出现一次,即 Set 中的元素是唯一的。

Array.from

  • 作用是什么

    • 把集合变成数组
    • 一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例
    • 返回一个新的数组实例。
  • 简单的例子

    • image.png

展开运算符实现数组

image.png

for(in)

  • 判断一个属性是否属于一个对象

稀疏数组

  • 什么是稀疏数组
  • 就是包含从0开始的不连续索引的数组
  • 简单例子[1, ,2]