blackLearning.github.io icon indicating copy to clipboard operation
blackLearning.github.io copied to clipboard

es5实现es6中两种新增的数据结构Map和Set

Open Fadingvision opened this issue 7 years ago • 2 comments

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基本一致,不再赘述

}

Fadingvision avatar Aug 14 '17 16:08 Fadingvision

瞎写,你告诉我你这个Map的key能放对象么。。。

Liugq5713 avatar Oct 22 '19 02:10 Liugq5713

Map 的特性并没有写出来啊...

ddzy avatar Nov 01 '19 05:11 ddzy