【javascript】數據結構-集合
阿新 • • 發佈:2017-10-22
一個 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】數據結構-集合