`
liuxing87327
  • 浏览: 82616 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JS Hash对象

阅读更多
/*
 * 哈希对象
 * 
 * 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

    在给定的“前端项目-murmurhash3js.zip”中,我们找到了一个JavaScript版本的MurmurHash3实现,特别适用于浏览器和服务器环境。 JavaScript 实现的MurmurHash3通常包含以下几个核心知识点: 1. **哈希函数**:哈希...

    js对象属性大全下载

    ### JavaScript对象属性详解 在深入探讨JavaScript对象属性之前,我们首先需要理解JavaScript是一种广泛应用于网页开发的编程语言,它能够使网页变得动态、交互性更强。JavaScript中的对象是其核心特性之一,几乎...

    nodejs geohash

    Node.js是流行的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码。结合这两个概念,"nodejs geohash"指的是在Node.js环境中使用Geohash技术来处理地理位置数据。 Geohash是一种将地理坐标(经度和...

    Prototype使用指南之hash.js

    创建一个Hash对象非常简单,只需要调用`$H(object)`方法,其中`object`可以是一个普通的JavaScript对象,包含键值对。例如: ```javascript var myHash = $H({key1: 'value1', key2: 'value2'}); ``` 这将创建一个...

    javascript document对象详细介绍

    ### JavaScript Document对象详解 #### 一、概述 在Web开发中,`document`对象是浏览器提供的核心对象之一,它代表了当前加载的HTML文档,并且提供了访问和操作文档中的元素和内容的方法。通过`document`对象,...

    Prototype Hash对象 学习

    在JavaScript的世界里,Prototype库提供了一个名为`Hash`的对象,它是对Java中`HashMap`的一种简化实现。`Hash`对象主要用于存储键值对,虽然它的功能没有`HashMap`那么全面,但仍然提供了许多实用的方法来操作键值...

    js document对象详解

    JS 的 document 对象详解 作为 JavaScript 脚本语言中最重要的对象之一,document 对象提供了大量的属性和方法来操作和控制 HTML 文档。下面是对 document 对象的详细介绍。 document 对象属性 1. document.title...

    JavaScript[对象.属性]集锦

    `LANGUAGE`属性定义了脚本语言类型,通常是"JavaScript",而`SRC`属性则指定了一个外部.js文件的URL,使得脚本可以从外部文件中加载。 `windows`对象是每个HTML文档的顶层对象,它包含了多个重要的属性和方法。例如...

    获取一个字符串的散列hash

    然而,JavaScript原生并不支持这些算法,因此通常需要引入第三方库,比如`crypto-js`或者在本例中提到的`sindresorhus-string-hash-f609621`。 `sindresorhus-string-hash`是一个小巧的JavaScript库,由Sindre ...

    js数组去重的hash方法

    例如,对象{"name":1}和{"name":2}尽管内容不同,但它们在JavaScript中被视为不同的引用,根据hash方法的逻辑,它们会被视为不同的元素,因此不会被去重。 对于对象类型的元素,要去重可能需要其他的策略,例如将...

    Javascript常用对象.txt

    ### JavaScript常用对象详解 在JavaScript编程中,对象是其核心组成部分之一,它们为开发者提供了丰富的功能和灵活性。本文将深入探讨一些常用的JavaScript内置对象及其属性和方法,帮助开发者更好地理解和运用这些...

    前端开源库-hash-it

    1. **兼容性**:Hash-It库通常与现代浏览器兼容,并且可以在Node.js环境中运行,这使得它在前后端都可以无缝使用。 2. **灵活性**:它可以对任何类型的JavaScript对象进行散列,包括基本类型(如字符串、数字、布尔...

    javascript的document对象

    ### JavaScript的Document对象详解 在Web开发中,`Document`对象是浏览器提供的核心对象之一,它代表了当前加载的HTML文档,并提供了与该文档交互的方法和属性。掌握`Document`对象的基本用法对于进行前端开发至关...

    利用原生循环依赖关系序列化复杂JavaScript对象或ES6类

    在JavaScript开发中,序列化是将复杂对象转换为可存储或传输的数据格式的过程,而反序列化则是将这种数据恢复为原始对象。在处理包含循环依赖关系的对象时,即一个对象引用了另一个对象,而后者又反过来引用了前者,...

    Javascript的document对象

    在JavaScript中,`document`对象是所有其他DOM(Document Object Model)操作的基础。 首先,我们可以使用`document`对象的一些基本属性来获取或设置文档的信息。例如,`document.title`用于设置或获取文档的标题,...

    利用JS hash制作单页Web应用的方法详解

    这里要讲的hash(也叫哈希),指的是JS中location对象的hash属性,它返回的是URL中#后所跟的零个或多个字符。通常,我们可以通过location.hash的方式获取哈希值或设置哈希值。当然,我们也可以通过设置a标签的href...

    JavaScript[对象.属性]集锦、事件查询综合

    - `SRC`: 定义外部JavaScript文件的URL,该文件通常以.js扩展名结尾。 #### 2. `window` 对象 - **概述**: 每个HTML文档都有一个顶层的`window`对象,它代表浏览器窗口。 - **属性**: - `frames[]`: 子框架数组...

    JavaScript的浏览器对象详解

    本文将深入探讨JavaScript的浏览器对象,帮助开发者更好地理解和利用这些对象。 1. **window对象**:作为全局对象,window是所有JavaScript代码的上下文。它代表了浏览器的一个窗口或框架,包含了文档、导航、历史...

Global site tag (gtag.js) - Google Analytics