1. 程式人生 > >【javascript】數據結構-集合

【javascript】數據結構-集合

一個 turn itl ole ctype rop highlight per text

<!DOCTYPE html>
<html>
<head>
	<title>集合</title>
	<meta charset="utf-8">
	<script type="text/javascript">
		function Set(){

			let items = {};

			// add:添加一個新的項
			this.add = function(value){
				if(!this.has(value)){
					// 添加一個值的時候,把它同時作為鍵和值保存,有利於查找這個值
					items[value] = value;
					return true;
				}
				return false;
			};

			// delete:刪除值
			this.delete = function(value){
				if(this.has(value)){
					delete items[value];
					return true;
				}
				return false;
			};

			// has:如果值在集合中返回true,否則返回false
			this.has = function(value){
				return items.hasOwnProperty(value);
			};

			// clear:移除集合中的所有項
			this.clear = function(){
				items = {};
			};

			// size:返回集合中所包含的元素數量,與數組的length屬性類似
			this.size = function(){
				return Object.keys(items).length;
			};

			// sizeLegacy:跨瀏覽器兼容返回集合元素數量
			this.sizeLegacy = function(){
				let count = 0;
				for(let key in items){
					if(items.hasOwnPrototype(key)){
						++count;
					}
				}
				return count;
			};

			// values:返回一個包含集合中所有數據的數組
			this.values = function(){
				let values = [];
				for(let i=0, keys = Object.keys(items); i<keys.length; i++){
					values.push(items[keys[i]]);
				}
				return values;
			};

			// valuesLegacy:跨瀏覽器兼容
			this.valuesLegacy = function(){
				let values = [];
				for(let key in items){
					if(items.hasOwnPrototype(key)){
						values.push(items[key]);
					}
				}
				return values;
			};

			// getItems
			this.getItems = function(){
				return items;
			};

			// union:並集
			this.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;
			};

			// intersection:交集
			this.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;
			};

			//difference:差集
			this.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;
			};

			// subset:子集
			this.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;
			}

		}

		// Set的使用
		var set1 = new Set();
		set1.add(1);
		set1.add(2);
		set1.add(3);

		var set2 = new Set();
		set2.add(1);
		set2.add(2);
		set2.add(3);
		set2.add(4);
		set2.add(5);

		var set3 = new Set();
		set3.add("a");
		set3.add("b");
		set3.add("c");
		set3.add("d");

		// 打印集合大小
		console.log(set1.size());				//3
		console.log(set2.size());				//5
		console.log(set3.size());				//4

		//打印集合元素的數組形式
		console.log(set1.values());				//[1,2,3]
		console.log(set2.values());				//[1,2,3,4,5]
		console.log(set3.values());				//["a", "b", "c", "d"]

		 // 求set1和set2的並集
		 let set12 = set1.union(set2);
		 console.log(set12.values());			//[1,2,3,4,5]
		 
		 // 求set1和set2的交集
		 let _set12  = set1.intersection(set2);
		 console.log(_set12.values());			//[1,2,3]

		 // 求set1和set2的差集
		 let set2_1 = set2.difference(set1);
		 console.log(set2_1.values());			//[4,5]
		 
		 // 判斷set1是否為set2的子集
		 console.log(set1.subset(set2));		//true

		 // 判斷set3是否為set2的子集
		 console.log(set3.subset(set2));		//false
	</script>
</head>
<body>

</body>
</html>

  

【javascript】數據結構-集合