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

  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》

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

  1. JavaScript学习笔记-自定义集合类

    //集合类Set( ES6标准才有的类,目前兼容性较差)//自定义集合类:extend = function (o,p){ //定义一个复制对象属性的类函数 for(var x in p){ o[x] ...

  2. javascript——集合类

    /** * Created by Administrator on 2015/4/14. */ function Set() { this.values = {}; this.n = 0; this. ...

  3. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  4. javascript中一些常见的兼容性问题

    下面是一些Javascript的IE和Firefox(火狐)兼容性的常用例子 1. document.formName.item("itemName") 问题 说明:IE下,可以使 ...

  5. js/javascript代码注释规范与示例

    文件注释 文件注释位于文件的最前面,应包括文件的以下信息:概要说明及版本(必须)项目地址(开源组件必须)版权声明(必须)开源协议(开源组件必须)版本号(必须)修改时间(必须),以ISO格式表示(可使用 ...

  6. 使用javascript实现贪吃蛇游戏

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

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

    一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...

  8. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  9. 第九章:Javascript类和模块

    (过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某 ...

随机推荐

  1. 通过圆形载入View了解自定义View

    这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...

  2. EMC学习之电磁辐射

    我们在接触新鲜事物的时候,通常习惯用自己熟悉的知识去解释自己不熟悉的事物.EMC知识更多的涉及到微波和射频,对于像我这种专注于信号完整性而 对EMC知识知之甚少的菜鸟来说,最初也只能用SI的一些基础知 ...

  3. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

  4. Report processing of Microsoft Dynamic AX

    Report processing of Microsoft Dynamic AX 版权声明:本文为博主原创文章,未经博主允许不得转载. The implementation of a general ...

  5. angularjs自动化测试系列之karma

    angularjs自动化测试系列之karma karma test with jasmine 更好的利用工具是为了让生活更美好. 需要安装的东西: npm install karma -g mkdir ...

  6. 元素绝对定位以后设置了高宽,a标签不能点击的原因总结

    元素绝对定位以后设置了高宽,a标签不能点击的原因: 1.元素内并无内容 2.背景是透明的,无任何背景图或者颜色 解决方法: 1.如果不是绝对定位元素的,可以用相对定位 2.给元素加透明的背景图 3.I ...

  7. Security8:删除Role 和 User

    数据库的Role 和 User都是基于Specified DB的,在删除这些Principal之前,必须使用Use clause,切换到指定的DB中. sys.database_role_member ...

  8. OpenCASCADE Curve Length Calculation

    OpenCASCADE Curve Length Calculation eryar@163.com Abstract. The natural parametric equations of a c ...

  9. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  10. First Blog

    俗话说“笨鸟先飞”,遗憾的是我这只笨鸟直到今天才意识到个人博客的重要性. 原来记录下学习生活中的每一丝领悟与思考,可以让个人内在,对知识的理解得到更好的升华. 有梦的人很美,追梦的人更美.像我的座右铭 ...