JavaScript 自己封装的Set
来源:互联网 发布:abbyy12序列号mac 编辑:程序博客网 时间:2024/05/14 22:03
function Set() {
this.values = {};//集合数据保存对象的属性值
this.length = 0; //集合中值的个数
this.add.apply(this, arguments);//把所有的参数添加到集合
};
//集合中添加元素
Set.prototype.add = function () {
for (var i = 0, len = arguments.length; i < len; i++) {
var val = arguments[i];
var str = Set._valToStr(val);//转换为字符串
if (!this.values.hasOwnProperty(str)) { //如果不在集合中,将字符串和值对应起来,集合中的长度+1
this.values[str] = val;
this.length++;
}
}
};
//获取值
Set.prototype.get = function (index) {
if (isNaN(parseFloat(index)) || !isFinite(index) || index >= this.length)
return undefined;
for (var s in this.values) { //集合中所有的字符串
if (this.values.hasOwnProperty(s)) {
if (index == 0)
return this.values[s];
index–;
}
}
return this;//支持链式调用
};
//集合中删除元素
Set.prototype.remove = function () {
for (var i = 0, len = arguments.length ; i < len; i++) {
var str = Set._valToStr(arguments[i]);
if (this.values.hasOwnProperty(str)) {
delete this.values[str];
this.length–;
}
}
return this;//返回this为了支持链式调用
};
//是否包含某个值
Set.prototype.contains = function (value) {
return this.values.hasOwnProperty(Set._valToStr(value));
};
//返回集合的长度
Set.prototype.size = function () {
return this.length;
};
//在指定的上下文遍历集合中的所有元素
Set.prototype.foreach = function (f, context) {
for (var s in this.values) { //集合中所有的字符串
if (this.values.hasOwnProperty(s)) { //去掉继承而来的属性
f.call(context, this.values[s]);
}
}
};
//比较两个Set是否相等
Set.prototype.equals = function (that) {
if (this == that)
return true;
//如果that 对象不是一个集合,它和this不相等,使用instanceof 使这个方法可以应用于Set的任何子类
//注意null和undefined两个值是无法用于instanceof 运算的
if (!(that instanceof Set))
return false;
if (this.size() != that.size())
return false;
try {
this.foreach(function (v) { if (!(that.contains(v))) throw false; });
}
catch (e) {
if (e === false)
return false;
throw e;
}
};
//私有函数(通常使用_开始),用来将任意js的值和字符串对应
Set._valToStr = function (value) {
switch (value) {
case undefined:
return “undefined”;
case null:
return “null”;
case true:
return “true”;
case false:
return “false”;
default:
switch (typeof value) {
case “number”: //数字带有number前缀
return “number” + value;
case “string”://字符串带有string前缀
return “string” + value;
default:
return “@” + objectId(value);
}
}
//对任意对象,都返回一个字符串,针对不同的对象,此函数返回不同的字符串,对于同一个对象多次调用,总是返回相同的字符串
//为了做到这一点,给对象o创建一个属性,在ES5中这个属性不可枚举且是只读的
function objectId(o) {
var prop = “|objectid|”;//私有属性,存放id
if (!o.hasOwnProperty(prop)) {
o[prop] = Set._valToStr.next++;
}
return o[prop];
};
};
Set._valToStr.next = 0;//初始化id的值
使用如下:
var set = new Set(); set.add(true); set.add(false); set.add(true); set.add(false); set.add(1); set.add(null); console.log(set.size()); console.log(); console.log(set.get(5)); console.log(); for (var i = 0; i < set.size(); i++) { console.log(set.get(i)); } console.log(); set.foreach(console.log,document);
“`
- JavaScript 自己封装的Set
- JavaScript自己封装ajax的js
- javaScript--3.封装自己的scroll
- 自己写的封装好的简单的AJAX--javascript
- 自己写的一个JavaScript 操作XML 封装类
- 我自己的Javascript 库,封装了一些常用函数
- 原生javascript自己封装的常用小方法。
- 自己封装的javascript工具类bee.js
- 如何打造属于自己的Javascript武器库(封装方法)
- 自己封装的ajax
- 自己封装的泛型链表
- 封装自己的Framwork
- 封装自己的理解
- 自己封装的ajax
- MapList 自己封装的
- 封装自己的printf
- 自己封装的轮播图
- 封装自己的jquery
- leetcode-112-Path Sum
- iOS动画详解
- Python重载操作符
- 浅谈负载均衡
- 0207
- JavaScript 自己封装的Set
- 进阶篇:2)结构设计装备必备
- 微信开发者了解微信后台通讯流程
- 类似py2exe软件真的能保护python源码吗
- Python编程-基础知识-python项目包和文件的管理以及如何引用相对路径的包和模块
- 题目1081:递推数列
- Centos7使用桥接时候出现无法连接到网络的问题
- 移动端点击元素出现闪烁
- 一个90后博士眼中香港房奴梦:不吃不喝大干20年