Map,Set复习巩固

58 阅读3分钟

Map-Set

前要

最近打算开一个leetcode专栏,在开始之前好好复习巩固一下数据结构的一些前置知识,争取写好算法!!

介绍

Map和Set对象是在ES2015 (ES6) 中被引入的,作为一种由 key值标记的数据容器。 Map和Set对象承载的数据元素可以按照插入时的顺序,被迭代遍历

能迭代遍历在我前面js遍历那篇文章细说过 js遍历,是因为 Iterator(遍历器)帮助实现了遍历的功能。

Set对象

Set的本身结构很类似数组,但是它的成员的值不能重复

Set是一个构造函数(new Set(args)),它可以通过add方法添加成员

看个案列

let setObj = new Set();
[1, 2, 2, 1, 3, 3, 4, 4].forEach((x) => setObj.add(x));
for (let k of setObj) {
  console.log(k); //1 2 3 4
}

可以看到内部已经完成了去重的操作。

我们看看Set实例的属性和方法

image.png add为增加,delete删除,has返回一个boolean,判断是否包含某个值,forEach用于遍历,size属性输出Set实例的长度。它的方法的名字对应的功能基本上和数组一样,这也是因为和数组一样都实现了Iterator,能够遍历。

案例看一看就好了

let setArr = new Set();
[1, 2, 2, 1, 3, 3, 4, 4].forEach((x) => setArr.add(x));

//我们定义一个输出方法,可以重复调用,当然你也可以直接输出SetArr
const _toString = () => {
  for (let k of setArr) {
    console.log(k);
  }
};

_toString(); //1 2 3 4

console.log(setArr.has(2)); //true

setArr.delete(2);
_toString(); //1 3 4

// forEach(callbackfn: (value: unknown, value2: unknown, set: Set<unknown>) => void, thisArg?: any): void
setArr.forEach((value, value2, set) => {
  // 由于Set对象没有键,所以key/index和value一样,所以叫value2好像value2没什么用。。
  console.log(value, value2); //1 1   3 3   4 4    0 0
  //  可以在这里操作set对象
  set.add(0);
});
_toString(); //1 3 4 0

setArr.clear();
_toString(); //没有输出

const mixType = [2, "2", "中文", { name: "syh", age: 19 }];
const mixSet = new Set(mixType);

for (let i of mixSet) {
  console.log(i); //2 2 中文 { name: 'syh', age: 19 }
  // 按照原来的类型构造
  i = 2;
}

当然 你也可以使用[...setArr]将它转为数组!支持Iterator就是这样方便。

map

map 则是添加键值,在构造添加的时候就要为值设置键,也可以通过键get,set等等操作。

let marArr = new Map([  ["name", 23],
  ["age", 18],
]);

let a1 = [...marArr.keys()]; //['name','age']
let a2 = [...marArr.values()]; // [23,18]
let a3 = [...marArr.entries()]; //["name", 23],["age", 18],

构造可以传入数组键值对来构造,也可以通过set添加。方法和属性有以下

image.png

总结

本章介绍两种数据结构,set和map。它们区别在于一个有键,一个没键,我们可以用它们来处理一些数据。

注意一点就是set方法添加和add方法添加都是往数组尾部添加,因为内部是一个栈的结构。 特来补充,栈的这个特点很重要,也是为什么要使用set,map很多时候需要用到这个特性来完成一些算法。

结语

本次的文章到这里就结束啦!♥♥♥读者大大们认为写的不错的话点个赞再走哦 ♥♥♥ 我们一起学习!一起进步!