一个 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】数据结构-集合
来源: http://www.bubuko.com/infodetail-2361652.html