/*
* 哈希对象
*
* 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
分享到:
相关推荐
在给定的“前端项目-murmurhash3js.zip”中,我们找到了一个JavaScript版本的MurmurHash3实现,特别适用于浏览器和服务器环境。 JavaScript 实现的MurmurHash3通常包含以下几个核心知识点: 1. **哈希函数**:哈希...
### JavaScript对象属性详解 在深入探讨JavaScript对象属性之前,我们首先需要理解JavaScript是一种广泛应用于网页开发的编程语言,它能够使网页变得动态、交互性更强。JavaScript中的对象是其核心特性之一,几乎...
Node.js是流行的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码。结合这两个概念,"nodejs geohash"指的是在Node.js环境中使用Geohash技术来处理地理位置数据。 Geohash是一种将地理坐标(经度和...
创建一个Hash对象非常简单,只需要调用`$H(object)`方法,其中`object`可以是一个普通的JavaScript对象,包含键值对。例如: ```javascript var myHash = $H({key1: 'value1', key2: 'value2'}); ``` 这将创建一个...
### JavaScript Document对象详解 #### 一、概述 在Web开发中,`document`对象是浏览器提供的核心对象之一,它代表了当前加载的HTML文档,并且提供了访问和操作文档中的元素和内容的方法。通过`document`对象,...
在JavaScript的世界里,Prototype库提供了一个名为`Hash`的对象,它是对Java中`HashMap`的一种简化实现。`Hash`对象主要用于存储键值对,虽然它的功能没有`HashMap`那么全面,但仍然提供了许多实用的方法来操作键值...
JS 的 document 对象详解 作为 JavaScript 脚本语言中最重要的对象之一,document 对象提供了大量的属性和方法来操作和控制 HTML 文档。下面是对 document 对象的详细介绍。 document 对象属性 1. document.title...
`LANGUAGE`属性定义了脚本语言类型,通常是"JavaScript",而`SRC`属性则指定了一个外部.js文件的URL,使得脚本可以从外部文件中加载。 `windows`对象是每个HTML文档的顶层对象,它包含了多个重要的属性和方法。例如...
然而,JavaScript原生并不支持这些算法,因此通常需要引入第三方库,比如`crypto-js`或者在本例中提到的`sindresorhus-string-hash-f609621`。 `sindresorhus-string-hash`是一个小巧的JavaScript库,由Sindre ...
例如,对象{"name":1}和{"name":2}尽管内容不同,但它们在JavaScript中被视为不同的引用,根据hash方法的逻辑,它们会被视为不同的元素,因此不会被去重。 对于对象类型的元素,要去重可能需要其他的策略,例如将...
### JavaScript常用对象详解 在JavaScript编程中,对象是其核心组成部分之一,它们为开发者提供了丰富的功能和灵活性。本文将深入探讨一些常用的JavaScript内置对象及其属性和方法,帮助开发者更好地理解和运用这些...
1. **兼容性**:Hash-It库通常与现代浏览器兼容,并且可以在Node.js环境中运行,这使得它在前后端都可以无缝使用。 2. **灵活性**:它可以对任何类型的JavaScript对象进行散列,包括基本类型(如字符串、数字、布尔...
### JavaScript的Document对象详解 在Web开发中,`Document`对象是浏览器提供的核心对象之一,它代表了当前加载的HTML文档,并提供了与该文档交互的方法和属性。掌握`Document`对象的基本用法对于进行前端开发至关...
在JavaScript开发中,序列化是将复杂对象转换为可存储或传输的数据格式的过程,而反序列化则是将这种数据恢复为原始对象。在处理包含循环依赖关系的对象时,即一个对象引用了另一个对象,而后者又反过来引用了前者,...
在JavaScript中,`document`对象是所有其他DOM(Document Object Model)操作的基础。 首先,我们可以使用`document`对象的一些基本属性来获取或设置文档的信息。例如,`document.title`用于设置或获取文档的标题,...
这里要讲的hash(也叫哈希),指的是JS中location对象的hash属性,它返回的是URL中#后所跟的零个或多个字符。通常,我们可以通过location.hash的方式获取哈希值或设置哈希值。当然,我们也可以通过设置a标签的href...
- `SRC`: 定义外部JavaScript文件的URL,该文件通常以.js扩展名结尾。 #### 2. `window` 对象 - **概述**: 每个HTML文档都有一个顶层的`window`对象,它代表浏览器窗口。 - **属性**: - `frames[]`: 子框架数组...
本文将深入探讨JavaScript的浏览器对象,帮助开发者更好地理解和利用这些对象。 1. **window对象**:作为全局对象,window是所有JavaScript代码的上下文。它代表了浏览器的一个窗口或框架,包含了文档、导航、历史...