Map与Set的使用与不同

164 阅读3分钟

一、Map

   const newMap = new Map()
   newMap.set(1, 'one')
   newMap.get(1)//one

增删改查的方法

    size:返回Map对象中所包含的键值对个数
    set(key, val):向Map中添加新元素
    get(key):通过键值查找特定的值
    has(key):判断Map对象中是否有key,若有返回true,否则返回false
    delete (key):通过键值从Map中移除对应的数据
    clear():将这个Map中的所有元素删除

遍历的方法

    keys():返回键名的遍历器
    values():返回键值的遍历器
    entries():返回键值对的遍历器
    forEach():使用回调函数遍历每个成员

遍历方法的使用

    const newMap = new Map()
    newMap.set(1, 'one')
    newMap.set(2, 'two')
    newMap.set(3, 'three')
    for (const item of newMap.keys()) {
        //1 2 3
        console.log(item)
    }
    for (const item of newMap.values()) {
        // 'one'    'two'  'three'
        console.log(item)
    }
    for (const item of newMap.entries()) {
        // [1,'one']    [2,'two']    [3,'three']
        console.log(item)
    }
    newMap.forEach(function (value, key) {
        //1,'one'   2,'two'     3,'three'
        console.log(key,value);
    })

二、Set

    const newSet = new Set()

增删改查的方法

    size:返回Set实例的成员总数
    add(val):添加某个值,返回Set结构本身(可以链式调用)
    delete(val):删除某个值,删除成功返回true,否则返回false
    has(val):返回一个布尔值,表示改制是否为Set的成员
    clear():清除所有成员,没有返回值

不能添加重复的值

    const newSet = new Set()
    newSet.add(1)
    newSet.add(2)
    newSet.add(3)
    newSet.add(3) //重复的值,添加失败
    console.log(newSet) //{1,2,3}

遍历的方法

    keys():返回键名的遍历器
    values():返回键值的遍历器
    entries():返回键值对的遍历器
    forEach():使用回调函数遍历每个成员

遍历方法的使用

    const newSet = new Set([1,2,3])
    for (const item of newSet.keys()) {
        //1 2 3
        console.log(item)
    }
    for (const item of newSet.values()) {
        //1 2 3
        console.log(item)
    }
    for (const item of newSet.entries()) {
        //[1, 1]   [2, 2]   [3, 3]
        console.log(item)
    }
    newSet.forEach(function (value) {
        //1 2 3
        console.log(value);
    });

Map的应用场景

两数之和

给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍
示例:
给定nums=[2,7,11,15],target = 9
因为nums[0]+nums[1] = 2+7=9
所以返回[0,1]
    let nums = [2, 7, 11, 15]
    let target = 9

方法一:双重for循环

   function numSum(nums, target) {
        for (let i = 0; i < nums.length; i++) {
            for (let j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] === target) {
                    return [i, j]
                }
            }
        }
    }
    console.log(numSum(nums, target))//[0,1]

方法二:Map的妙用

    function numSum(nums, target) {
        let newMap = new Map()
        for (let i = 0; i < nums.length; i++) {
            let result = target - nums[i]
            if (newMap.has(result)) {//判断Map中是否存在该值若存在则返回该值和当前下标,否则将结果和下标作为键值对添加到Map中
                return [newMap.get(result), i]
            }
            newMap.set(nums[i], i)
        }
    }
    console.log(numSum(nums, target))//[0,1]

Set的应用场景

求两个数组的并集

    const a = [1,2,3]
    const b = [2,3,4]
    
    const newSet = new Set([...a,...b])
    console.log(newSet)//{1, 2, 3, 4}

数组去重

const arr = [1,2,3,4,5,1,2,3,4,2,2,3,4]
console.log([...new Set(arr)]) //[1, 2, 3, 4, 5]

综上

Map与Set的共同点

1.所有元素自动排序

2.set以RBTree作为底层容器

Map与Set区别

1.Map类似于Object是键值对形式存在的,任意值都可成为他的键值

2.Set类似于数组只存在值,并且值是不重复的

3.Map的键是不能修改的,但是键对应的值是可以修改的,但是Set的值是不可修改的

欢迎各位看官老爷点赞,评论!