Set、Map 学习笔记
什么是Set,Map
Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构
- 集合
集合,是由一堆无序的、相关联的,且不重复的内存结构【数学中称为元素】组成的组合
- 字典
字典(dictionary)是一些元素的集合。每个元素有一个称作key 的域,不同元素的key 各不相同
那么集合和字典又有什么区别呢?
- 共同点:集合、字典都可以存储不重复的值
- 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储
Set
定义: Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用,Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的
js对Set的实现原理
/*js集合set类的实现*/
class Set {
constructor() {
this.items = {};
}
has(value) {
return this.items.hasOwnProperty(value);
}
add(value) {
if (!this.has(value)) {
this.items[value] = value;
return true;
} else {
return false;
}
}
remove(value) {
if (this.has(value)) {
delete this.items[value];
return true;
} else {
return false;
}
}
clear() {
this.items = {};
}
size() {
let count = 0;
for (let key in this.items) {
if (this.items.hasOwnProperty(key)) {
++count;
}
}
return count;
}
keys() {
let keys = [];
for (let key in this.items) {
if (this.items.hasOwnProperty(key)) {
keys.push(key);
}
}
return keys;
}
values() {
let values = [];
for (let value in this.items) {
if (this.items.hasOwnProperty(value)) {
values.push(this.items[value]);
}
}
return values;
}
}
// 并集 A U B
Set.prototype.union = function (otherSet) {
let unionSet = new Set();
let values = this.values();
for (let i = 0; i < values.length; i++) {
unionSet.add(values[i]);
}
values = otherSet.values();
for (let i = 0; i < values.length; i++) {
unionSet.add(values[i]);
}
return unionSet;
}
// 交集 A ∩ B
Set.prototype.intersection = function (otherSet) {
let intersectionSet = new Set();
let values = this.values();
for (let i = 0; i < values.length; i++) {
if (otherSet.has(values[i])) {
intersectionSet.add(values[i]);
}
}
return intersectionSet;
}
// 差集 A-B
Set.prototype.difference = function (otherSet) {
let differenceSet = new Set();
let values = this.values();
for (let i = 0; i < values.length; i++) {
if (!otherSet.has(values[i])) {
differenceSet.add(values[i]);
}
}
return differenceSet;
}
// 子集 A⊆B
Set.prototype.subset = function (otherSet) {
if (this.size() > otherSet.size()) {
return false;
} else {
let values = this.values();
for (let i = 0; i < values.length; i++) {
if (!otherSet.has(values[i])) {
return false;
}
}
return true;
}
}
// 子集 A⊆B
Set.prototype.entries = function (otherSet) {
if (this.size() > otherSet.size()) {
return false;
} else {
let values = this.values();
for (let i = 0; i < values.length; i++) {
if (!otherSet.has(values[i])) {
return false;
}
}
return true;
}
}
let set = new Set();
set.add(1);
set.add(2);
// set.add(5);
// set.add(9);
console.log(set); // Set { items: { '1': 1, '2': 2 } }
console.log(set.keys()); // [ '1', '2' ]
console.log(set.values()); // [ 1, 2 ]
console.log(set.size()); // 2
set.remove(1);
console.log(set); // Set { items: { '2': 2 } }
let otherset = new Set();
otherset.add(1);
otherset.add(2);
otherset.add(3);
otherset.add(4);
console.log(set.union(otherset)); // Set { items: { '1': 1, '2': 2, '3': 3, '4': 4 } }
console.log(set.intersection(otherset)); //Set { items: { '2': 2 } }
console.log(set.difference(otherset)); // Set { items: {} }
console.log(set.subset(otherset)); // true
set使用方法
const set = new Set([1,2,1,2])
console.log(set) // {1,2}
console.log(new Set([1,2,1,2]).size) // 2
let set = new Set()
set.add(1)
set.add(2)
set.add(2)
set.add(3)
console.log(set) // {1,2,3}
set.has(2) // true
set.delete(2)
set.has(2) // false
set.clear()
Map
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of 循环在每次迭代后会返回一个形式为[key,value]的数组
js对Map的实现
function Map() {
var obj = {};
this.put = function(key, value) {
obj[key] = value;//把键值绑定到obj对象上
}
//size方法,获取Map容器的个数
this.size = function() {
var count = 0;
for(var attr in obj) {
count++;
}
return count;
}
//get方法,根据key获取value的值
this.get = function(key) {
if(obj[key] || obj[key] === 0 || obj[key] === false) {
return obj[key]
} else {
return null;
}
}
//remove方法,删除方法
this.remove = function(key) {
if(obj[key] || obj[key] === 0 || obj[key] === false) {
delete obj[key]
}
}
//each方法,遍历方法
this.eachMap = function(callBack) {
for(var attr in obj) {
callBack(attr, obj[attr])
}
}
}
var m = new Map();
m.put('01', "aaa");
m.put('02', "bbb");
m.put('03', "ccc");
m.put('04', "ddd");
m.put('05', "eee");
//alert(m.size());
//alert(m.get('03'));
// alert(m.remove('ccc'));
m.eachMap(function(key ,value) {
console.log(key)
console.log(value)
})
map基本使用
let map = new Map()
map.set('name', 'vuejs.cn');
console.log(map.get('name'))
console.log(map.size) // 1
console.log(new Map([['name','vue3js.cn'], ['age','18']]).size) // 2
操作方法
- set(key, value): 向 Map 中加入或更新键值对
- get(key): 读取 key 对用的值,如果没有,返回 undefined
- has(key): 某个键是否在 Map 对象中,在返回 true 否则返回 false
- delete(key): 删除某个键,返回 true, 如果删除失败返回 false
- clear(): 删除所有元素
let map = new Map()
map.set('name','vue3js.cn')
map.set('age','18')
console.log(map) // Map {"name" => "vuejs.cn", "age" => "18"}
map.get('name') // vue3js.cn
map.has('name') // true
map.delete('name')
map.has(name) // false
map.clear() // Map {}