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实例的属性和方法
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添加。方法和属性有以下
总结
本章介绍两种数据结构,set和map。它们区别在于一个有键,一个没键,我们可以用它们来处理一些数据。
注意一点就是set方法添加和add方法添加都是往数组尾部添加,因为内部是一个栈的结构。 特来补充,栈的这个特点很重要,也是为什么要使用set,map很多时候需要用到这个特性来完成一些算法。
结语
本次的文章到这里就结束啦!♥♥♥读者大大们认为写的不错的话点个赞再走哦 ♥♥♥ 我们一起学习!一起进步!