JavaScript实现通过的集合类

  集合是一种数据结构,用以表示非重复值的无序集合。集合的基础方法包括添加值、检测值是否在集合中,这种集合需要一种通用的实现,以保证操作效率。

  JavaScript的对象是属性名以及与之对应的值的基本集合。用JavaScript实现了一个通用的Set类,它实现了从js值到唯一字符串的映射,然后将字符串用做属性名。对象和函数都不具备如此简明可靠的唯一字符串表示。

  因此集合类必须给集合中的每一个对象或函数定义一个唯一的属性标识。

 1 //通用集合类
 2 function Set(){          //这是一个构造函数
 3     this.value={};        //集合数据保存在对象的属性里
 4     this.n=0;            //集合中值的个数
 5     this.add.apply(this,arguments); //把所有参数都添加进这个集合
 6 }
 7
 8 //将每个参数都添加至集合
 9 Set.prototype.add=function(){
10     for(var i=0;i<arguments.length;i++){        //遍历每个参数
11         var val=arguments[i];                    //待添加到集合中的值
12         var str=Set._v2s(val);                    //把它转换为字符串
13         if(!this.value.hasOwnProperty(str)){    //如果不在集合中
14             this.value[str]=val;                //将字符串和值对应起来
15             this.n++;                            //集合中值的计数
16         }
17     }
18     return this;                                //支持链式方法调用
19 }
20
21 //从集合中删除元素,删除元素由参数指定
22 Set.prototype.remove=function(){
23     for(var i=0;i<arguments.length;i++){
24         var str=Set._v2s(arguments[i]);
25         if(this.values.hasOwnProperty(str)){
26             delete this.value[str];
27             this.n--;
28         }
29     }
30     return this;
31 }
32
33 //遍历集合中的所有元素,在指定上下文中调用f
34 Set.prototype.foreach=function(f,context){
35     for(var s in this.values){
36         if(this.value.hasOwnProperty(s))        //忽略继承的属性
37             f.call(context,this.value[s]);
38     }
39 }
40
41 //这是一个内部函数,用以将任意JavaScript值和唯一的字符串对应起来
42 Set._v2s=function(val){
43     switch(val){
44         case undefined:    return ‘u‘;
45         case null:        return ‘n‘;
46         case true:        return ‘t‘;
47         case false:        return ‘f‘;
48         default:        switch(typeof val){
49             case ‘number‘:    return ‘#‘+val;
50             case ‘string‘:    return ‘"‘+val;
51             default:    return ‘@‘+objectId(val);
52         }
53     }
54
55     //对任意对象来说,都会返回一个字符串
56     //针对不同的对象,这个函数会返回不同的字符串
57     //对于同一个对象的多次调用,总是返回相同的字符串
58     //为了做到这一点,它给o创建了一个属性,在ES5中,这个属性是不可枚举且是只读
59     function objectId(o){
60         var prop="|**objectid**|";        //私有属性,用以存放id
61         if(!o.hasOwnProperty(prop))        //如果对象没有id
62             o[prop]=Set._v2s.next++;    //将下一个值赋给它
63         return o[prop];                    //返回这个id
64     }
65 };
66 Set._v2s.next=100;    //设置初始id值

  来源于《JavaScript权威指南 9.6.1》

时间: 2024-08-30 01:07:21

JavaScript实现通过的集合类的相关文章

JavaScript中模拟实现Java的集合类Map的常用方法

JavaScript中模拟实现Java的集合类Map的常用方法 (function Map(){ var size = 0, map = {}, strundefined; function MapCache() { } MapCache.prototype.put = function (key, value){ if ( key === null || key === undefined){ throw new Error(" null or undefined is not a illeg

201507020721_《Javascript权威指南(第六版)——OO:集合类和枚举类、标准转化方法》(P217-225)

一.JavaScript中面向对象技术(解决如何利用js中的累进行编程) 1. 集合类例子 集合表示非重复无序集合.两个基础方法:a. 添加到集合中  b. 是否在集合中. 参照:p218  set.js 2. 枚举例子 枚举表示值的有限集合. 扑克牌的例子 二. 标准转化方法 1. toString();  toLocalString(); 2. valueOf(); 3. toJSON();  当一个对象进行序列化操作时,它会忽略对象的prototype和constructor. 注意:JS

javascript——集合类

1 /** 2 * Created by Administrator on 2015/4/14. 3 */ 4 function Set() { 5 this.values = {}; 6 this.n = 0; 7 this.add.apply(this, arguments); 8 } 9 Set.prototype = { 10 add: function () { 11 for (var i = 0; i < arguments.length; i++) { 12 var val = a

Javascript 多浏览器兼容性问题及解决方案

一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName"]:Firefox 下,只能使用document.formName.elements["elementName"]. 解决方法:统一使用document.formName.elements["el

javascript多浏览器的兼容

一.document.formName.item("itemName") 问题 问题说明:IE下,可以使用 document.formName.item("itemName") 或 document.formName.elements ["elementName"]:Firefox 下,只能使用document.formName.elements["elementName"]. 解决方法:统一使用document.formNa

javascript 兼容问题

一.document.formName.item("itemName") 问题 问题说明:IE下,可以使用 document.formName.item("itemName") 或 document.formName.elements["elementName"]:Firefox下,只能使用document.formName.elements["elementName"]. 解决方法:统一使用document.formName

Javascript手记-垃圾收集

如果有人问.net的垃圾回收,大家会马上想到gc,那如果有人问你javascript如何进行内存管理的呢?挠挠头,一口香瓜,听我细细道来! javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存,大体的原理是找出那些不在使用的变量,然后释放它占用的内存,为此,垃圾收集器会按照固定的时间间隔周期的执行这一操作.(让我想起了oc中内存管理是通过引用计数来判定对象是否使用的)下面介绍一下javascript中常用的垃圾回收方式.(没想到这时候的香瓜这么甜,打几行字就得来几

Javascript的IE跟Firefox(火狐)兼容性-转

Javascript的IE和Firefox(火狐)兼容性-转 em 问题(1)现有问题:现有代码中存在许多 documenem("itemName") 这样的语句,不能在Firefox(火狐)下运行(2)解决方法:改用 document.formName.elements["elementName"](3)其它参见 2 2. 集合类对象问题(1)现有问题:现有代码中许多集合类对象取用时使用 (),IE 能接受,Firefox(火狐)不能.(2)解决方法:改用 []

多浏览器兼容性问题及解决方案之Javascript篇

CSS跟JavaScript开发中,最令大家头疼的问题就是浏览器兼容性了,虽然很多文章有这方面的文章,但依然让很多开发人员晕头转向,而且也不够全面.这篇文章,将全面收集css和javascript在各种浏览器下的兼容性报告,也期待各位不断补充. 由于发觉内容收集越来越多,决定将CSS跟JavaScript分开. 一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 do