blackLearning.github.io
blackLearning.github.io copied to clipboard
es5实现es6中两种新增的数据结构Map和Set
es5下实现es6中两种新增的数据结构Map和Set
set结构是一种集合,集合是一组无序且唯一的项组成的。
// 首先新建起set结构的骨架
function Set(array) {
this.items = {};
if(array && array.length) {
array.forEach(function(value) {
this.items[value] = value;
})
}
}
接下来,需要声明一些集合可用的方法。 由于Set结构没有键名,只有键值(或者说键名和键值是同一个值), Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
- add(value):添加某个值,返回Set结构本身。
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- has(value):返回一个布尔值,表示该值是否为Set的成员。
- clear():清除所有成员,没有返回值。
- values(): 返回一个包含集合中所有值的数组
- size: 返回一个包含集合中的所有值的数量的属性
Set.prototype = {
constructor: Set,
size: Object.keys(this.items).length,
add: function(value) {
this.items[value] = value;
return this;
},
delete: function(value) {
if(this.has(value)) {
delete this.items[value];
return true
}
return false
},
has: function(value) {
return value in this.items;
},
clear: function() {
this.items = {};
},
// 由于Set结构没有键名,只有键值(或者说键名和键值是同一个值),所以key方法和value方法的行为完全一致。
// es6返回的是一个含有所有值的遍历器,这里用数组代替
values: function() {
return Object.keys(this.items);
},
keys: function() {
return Object.keys(this.items);
},
// forEach方法的参数就是一个处理函数。该函数的参数依次为键值、键名、集合本身(上例省略了该参数)。
// 另外,forEach方法还可以有第二个参数,表示绑定的this对象。
forEach: function(callback, context) {
var self = this;
Object.keys(this.items).forEach(function(key){
callback.call(context, self.items[key], key, slef.items);
})
},
// 并集
// es6: let union = new Set([...a, ...b]);
union: function(ohterSet) {
var unionSet = new Set();
var values = this.values();
values.forEach(val => {
unionSet.add(val);
})
var values = ohterSet.values();
values.forEach(val => {
unionSet.add(val);
})
return unionSet;
},
// 交集
// es6的写法:let intersect = new Set([...a].filter(x => b.has(x)));
intersection: function(ohterSet) {
var values = this.values();
var newArr = values.filter(val => {
return otherSet.has(val));
})
return new Set(newArr);
},
// 差集
diff: function(otherSet) {
var values = this.values();
var newArr = values.filter(val => {
return !otherSet.has(val));
})
return new Set(newArr);
}
}
map结构
Map结构实际上就是数据结构中经典的数据结构,在字典中,存储的是[建,值]对,其中键名可以用来查询特定元素的,
但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应, Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。
首先新建起set结构的骨架
function Map(array) {
this.items = {};
if(array && array.length) {
array.forEach(function(value) {
this.items[value[0]] = value[1];
})
}
}
然后我们声明一些字典(map)所能使用的方法
- set(key, value): 向字典中添加新元素。
- delete(key): 通过使用键值存在于整个字典中,返回true,反之返回false,
- has(value):返回一个布尔值,表示该值是否为map的成员。
- get(key): 通过键值来查找对应的数值
- clear():清除所有成员,没有返回值。
- values(): 返回一个包含集合中所有值的数组
- keys(): 返回一个键值组成的数组
- size: 返回一个包含集合中的所有值的数量的属性
Map.prototype = {
constructor: Map,
size: Object.keys(this.items).length,
set: function(key, value) {
this.items[key] = value
},
delete: function(key) {
if(this.has(key) {
delete this.items[key];
return true;
})
return false;
},
get: function(key) {
return this.items[key];
},
values: function() {
Object.keys(this.items).map(val => this.items[val]);
}
// ...其余方法实现方法与set基本一致,不再赘述
}
瞎写,你告诉我你这个Map的key能放对象么。。。
Map 的特性并没有写出来啊...