/*
* 哈希对象
*
* empty 清空hash。
* contains 检测hash是否包含此键值对,参数为key
* put 向hash增加一个键值对,参数两个,key与value
* get 根据key取得相应的value
* remove 根据key移除相应的键值对,返回修改后的hash
* pop 根据key移除相应的键值对,返回被移除的value
* keys 取得所有的键,以数组形式返回
* values 取得所有的值,以数组形式返回
* items 取得所有的键值对,以数组形式返回
* toObject 变成普通对象
* ensure 仅当此键不存在时才添加新的键值对
* forEach或each 类似Array.forEach,迭代执行传入函数
* map 类似Array.map,迭代执行传入函数,把执行结果放到一个新hash返回
* filter 类似Array.filter,迭代执行传入函数,把符合条件的键值对放到一个新hash返回
* toString 没什么好说的
*/
var Hash = function(obj) {
if (obj instanceof arguments.callee) return obj;
return new arguments.callee.fn.init(arguments);
};
Hash.fn = Hash.prototype = {
init: function(obj) {
var key = obj[0],
value = obj[1],
core = {},
toString = Object.prototype.toString,
i = 0;
if (obj.length === 2) { //如果有两个参数
core[key] = value;
} else {
if (toString.call(key) === '[object String]') {
key = key.replace(/^\s+|\s+$/g, ""); //进行trim操作
var arr = key.indexOf(",") !== -1 ? key.split(",") : key.split(/\s+/g);
while ((value = arr[i++])) core[value] = arr[i++];
} else if (toString.call(key) === '[object Array]') {
for (var i = 0, n = key.length; i < n; i++) core[i] = key[i]
} else {
core = key;
}
};
this.empty();
if (core) this.update(core);
},
empty: function() {
this._hash = {};
this.length = 0;
return this;
},
//用于初始化hash
//把普通对象的键值利用put方法传入_hash中,不考虑其prototype的成员
update: function(obj) {
for (var prop in obj) if (obj.hasOwnProperty(prop)) this.put(prop, obj[prop]);
return this;
},
contains: function(key) {
return this.get(key) !== void(0);
},
put: function(key, value) {
if (!this.contains(key)) { //如果没包含则
this.length++;
}
this._hash[key] = value;
return value;
},
//取得相应的值
get: function(key) {
return this._hash[key];
},
//移除一个键值对
remove: function(key) {
delete this._hash[key];
this.length--;
return this;
},
//移除指定的键值对,并返回对应的值
pop: function(key) {
var results = this.get(key);
this.remove(key);
return results;
},
//取得所有的键,以数组形式返回
keys: function() {
var keys = [],
obj = this._hash;
for (var prop in obj) if (obj.hasOwnProperty(prop)) keys.push(prop);
return keys;
},
//取得所有的值,以数组形式返回
values: function() {
var values = [],
obj = this._hash;
for (var prop in obj) if (obj.hasOwnProperty(prop)) values.push(obj[prop]);
return values;
},
//取得所有的键值对,以数组形式返回
items: function() {
var items = [],
obj = this._hash;
for (var prop in obj) if (obj.hasOwnProperty(prop)) items.push([prop, obj[prop]]);
return items;
},
//变成普通对象
toObject: function() {
return this._hash;
},
//仅当此键不存在时才添加,
ensure: function(key, value) {
var results = this.get(key);
if (results === void(0)) return this.put(key, value);
return results;
},
forEach: function(fn, bind) {
var pairs = this.items();
for (var i = 0, n = pairs.length; i < n; i++) {
fn.call(bind, pairs[i][1], pairs[i][0]);
}
},
map: function(fn, bind) {
var results = hash({});
this.each(function(value, key) {
results.put(key, fn.call(bind, value, key));
});
return results;
},
filter: function(fn, bind) {
var results = hash({});
this.each(function(value, key) {
if (fn.call(bind, value, key)) results.put(key, value);
});
return results;
},
index: function(val) { //与get方法相反,取得其key
var obj = this._hash;
for (var prop in obj) if (obj.hasOwnProperty(prop) && obj[prop] === val) return prop;
return null;
},
toString: function() {
var pairs = this.items(),
results = [];
for (var i = 0, n = pairs.length; i < n; i++) {
results[i] = pairs[i][0] + ":" + pairs[i][1]
}
return "{ " + results.join(", ") + " }";
},
each: this.forEach
};
Hash.fn.init.prototype = Hash.fn;
引用:http://blog.csdn.net/cheng5128/article/details/5072385
分享到:
相关推荐
Hash对象(关联数组)是Prototype新建的一个对象,要创建一个Hash对象可以调用$H(object)方法,因为javascript本身的特点(对象本身就是关联数组) ,所以实现Hash也很简单,Prototype中的Hash只是javascript的关联数组...
返回一个带有键lat和lon javascript 对象。geohash.neighbor(哈希字符串,方向) 在某个方向上查找 geohash 字符串的邻居。 Direction 是一个二元数组,即 [1,0] 表示北,[-1,-1] 表示西南。geohash.decode_bbox ...
这里要讲的hash(也叫哈希),指的是JS中location对象的hash属性,它返回的是URL中#后所跟的零个或多个字符。通常,我们可以通过location.hash的方式获取哈希值或设置哈希值。当然,我们也可以通过设置a标签的href...
微小而又快速的node.js对象哈希库,具有对属性/数组进行排序以提供恒定哈希值的功能。 它还提供了一种返回排序后的对象字符串的方法,该对象字符串可用于不带哈希的对象比较。 在其他类似产品中最快的产品之一(请...
hashObject(对象,选项?) 目的 类型: object 选项 类型: object 编码方式 类型: 'hex' | 'base64' | 'buffer' | 'latin1' 'hex' | 'base64' | 'buffer' | 'latin1' 默认值: 'hex' 返回的哈希的编码。 算法 ...
9.26 hash 属 性 9.27 Href 属 性 9.28 pathname 属 性 9.29 Protocol 属 性 第10 章 history 对 象 第11 章 layer 对 象 11.30 layer 属 性 11.31 layer 对象的方法 11.32 JavaScript 操作层 第12 章 字符串对象 ...
hash ( [ ] )hash ( { } )hash ( 1 )多态运算符一个经过精心计划的对象系统是很漂亮的:一种在设计中已经预见到了每种有意义的方法都可以使用的系统。 不可避免的是,另一层体系结构引入了一个新概念,并因此产生了...
2.6.2 导出jshash对象 2.6.3 将交易或者区块的timestamp转换为世界时 2.6.4 交易类型的文字描述 2.6.5 判断地址是否合法 2.6.6 判断字符串是否为交易id 2.6.7 判断是否为有效高度 2.7 智能合约 2.8 其他常用 3 示例
Hash 可以看作是一个 关联数组,它对每一个值都绑定了一个唯一的键(值并不必须是唯一的), 然而,它不能保证迭代时元素的...因为 JavaScript 程序语言的特性,每个对象实际上都是一个 hash,下面我们就来详细探讨下。
JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集。虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的...
Array 和 Hash 对象的混合 为什么? 有时(实际上是之后)我们处理对象集合(即用户列表),通常我们必须将其作为数组处理。 要找到特定的记录,我们必须在数组中查找它。 如果我们经常需要这个 - 做一个散列并...
GeoHash编码/解码有关GeoHash的更多信息 支持MongoDB,ElasticSearch和GeoJSON格式的GeoHash编码/解码: GeoJSON MongoDB Elasticsearch { longitude, latitude }对象在某些软件包中常用受启发。安装yarn add @...
9.26 hash 属性 9.27 Href 属性 9.28 pathname 属性 9.29 Protocol 属性 第10 章 history 对象 第11 章 layer 对象. 11.30 layer 属性. 11.31 layer 对象的方法 11.32 JavaScript 操作层 第12 章字符串对象...
JavaScript对象也可以称作一种数据结构,正如我们经常听说的“散列(hash)”、“散列表(hashtable)”、“字典 (dictionary)”、“关联数组(associative array)”。 JavaScript中对象可以分为三类: ①内置...
JOIA代表Javascript对象间接寻址。 JOIA背后的关键思想是简单而强大。 在Lua,Lisp和许多其他动态语言中,所有或某些对象都存储为哈希表,用于基于字符串的访问。 JOIA将这个天才的想法推向了更高的层次。 JOIA...
因为,JavaScript的数组非常特殊,而且如果你能够理解它,那么对于我们学习JSON对象语法就非常容易理解了--因为JSON就是一个数组--我们也可以把它看成一个Hashtable集合对象!本人认为,理解JavaScript的数组是学习...
JavaScript对象也可以称作一种数据结构,正如我们经常听说的“散列(hash)”、“散列表(hashtable)”、“字典 (dictionary)”、“关联数组(associative array)”。 JavaScript中对象可以分为三类: ①内置...
script src =" dist/multihash.min.js " type =" text/javascript " > </ script > 多哈希包括encode和decode功能。 encode接受一个32字节的缓冲区或十六进制编码的字符串,并将其转换为以base58编码的多...
Hash Map通常在JavaScript中作为一个简单的来存储键值对的地方,不过哈希对象Object并不是一个真正的哈希映射,没Java中的Hash Map来的那么强大,well,接下来带大家详解JavaScript中Hash Map映射结构的实现