`
liuxing87327
  • 浏览: 81346 次
  • 性别: 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

分享到:
评论

相关推荐

    Prototype使用指南之hash.js

    Hash对象(关联数组)是Prototype新建的一个对象,要创建一个Hash对象可以调用$H(object)方法,因为javascript本身的特点(对象本身就是关联数组) ,所以实现Hash也很简单,Prototype中的Hash只是javascript的关联数组...

    geohash:Node.js 和浏览器兼容的 javascript geohashing 函数

    返回一个带有键lat和lon javascript 对象。geohash.neighbor(哈希字符串,方向) 在某个方向上查找 geohash 字符串的邻居。 Direction 是一个二元数组,即 [1,0] 表示北,[-1,-1] 表示西南。geohash.decode_bbox ...

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

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

    node-object-hash:具有propertiesarrays排序的Node.js对象哈希库可提供恒定的哈希值。 它还提供了一种返回排序后的对象字符串的方法,该对象字符串可用于不进行哈希处理的对象比较

    微小而又快速的node.js对象哈希库,具有对属性/数组进行排序以提供恒定哈希值的功能。 它还提供了一种返回排序后的对象字符串的方法,该对象字符串可用于不带哈希的对象比较。 在其他类似产品中最快的产品之一(请...

    hash-obj:获取对象的哈希

    hashObject(对象,选项?) 目的 类型: object 选项 类型: object 编码方式 类型: 'hex' | 'base64' | 'buffer' | 'latin1' 'hex' | 'base64' | 'buffer' | 'latin1' 默认值: 'hex' 返回的哈希的编码。 算法 ...

    javascript高级教程.pdf

    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 章 字符串对象 ...

    pop-hash:适用于浏览器和Node.js的任意JavaScript对象的哈希运算符

    hash ( [ ] )hash ( { } )hash ( 1 )多态运算符一个经过精心计划的对象系统是很漂亮的:一种在设计中已经预见到了每种有意义的方法都可以使用的系统。 不可避免的是,另一层体系结构引入了一个新概念,并因此产生了...

    js-sdk-dist:Web, Android, IOS 的 SDK 和接口文档

    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 示例

    javascript实现获取字符串hash值

    Hash 可以看作是一个 关联数组,它对每一个值都绑定了一个唯一的键(值并不必须是唯一的), 然而,它不能保证迭代时元素的...因为 JavaScript 程序语言的特性,每个对象实际上都是一个 hash,下面我们就来详细探讨下。

    JSON与js对象序列化实例详解

    JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集。虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的...

    Armap:Array 和 Hash 对象的混合

    Array 和 Hash 对象的混合 为什么? 有时(实际上是之后)我们处理对象集合(即用户列表),通常我们必须将其作为数组处理。 要找到特定的记录,我们必须在数组中查找它。 如果我们经常需要这个 - 做一个散列并...

    geohash:为方便起见,支持MongoDB,ElasticSearch和GeoJSON格式的GeoHash编码的代码

    GeoHash编码/解码有关GeoHash的更多信息 支持MongoDB,ElasticSearch和GeoJSON格式的GeoHash编码/解码: GeoJSON MongoDB Elasticsearch { longitude, latitude }对象在某些软件包中常用受启发。安装yarn add @...

    javascript_高级编程

    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 对象深入学习总结(经典)

    JavaScript对象也可以称作一种数据结构,正如我们经常听说的“散列(hash)”、“散列表(hashtable)”、“字典 (dictionary)”、“关联数组(associative array)”。 JavaScript中对象可以分为三类: ①内置...

    redbank-js:Javascript对象间接寻址

    JOIA代表Javascript对象间接寻址。 JOIA背后的关键思想是简单而强大。 在Lua,Lisp和许多其他动态语言中,所有或某些对象都存储为哈希表,用于基于字符串的访问。 JOIA将这个天才的想法推向了更高的层次。 JOIA...

    使用JavaScript数组模拟Java的Hashtable集合

    因为,JavaScript的数组非常特殊,而且如果你能够理解它,那么对于我们学习JSON对象语法就非常容易理解了--因为JSON就是一个数组--我们也可以把它看成一个Hashtable集合对象!本人认为,理解JavaScript的数组是学习...

    深入学习JavaScript对象

    JavaScript对象也可以称作一种数据结构,正如我们经常听说的“散列(hash)”、“散列表(hashtable)”、“字典 (dictionary)”、“关联数组(associative array)”。 JavaScript中对象可以分为三类: ①内置...

    multi-hash:多哈希编码器

    script src =" dist/multihash.min.js " type =" text/javascript " &gt; &lt;/ script &gt; 多哈希包括encode和decode功能。 encode接受一个32字节的缓冲区或十六进制编码的字符串,并将其转换为以base58编码的多...

    详解JavaScript中Hash Map映射结构的实现

    Hash Map通常在JavaScript中作为一个简单的来存储键值对的地方,不过哈希对象Object并不是一个真正的哈希映射,没Java中的Hash Map来的那么强大,well,接下来带大家详解JavaScript中Hash Map映射结构的实现

Global site tag (gtag.js) - Google Analytics