`
ybyonline
  • 浏览: 40943 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

JS实现MAP

    博客分类:
  • JS
阅读更多

JS实现MAP

 

Map.js代码如下:

function Map(linkItems) {   
    this.current = undefined;   
    this._size = 0;   
    if(linkItems === false){  
        this.disableLinking();   
    }   
}  
/** 
 * 获取当前map 
 * @return 当前对象 
 */  
Map.noop = function() {   
    return this;   
};   
/** 
 * 非法操作 
 * @return 
 */  
Map.illegal = function() {   
    throw new Error("非法操作,Map已经被禁用");   
};   
/** 
 *  
 * @param obj 
 * @param foreignKeys 
 * @return 
 */  
Map.from = function(obj, foreignKeys) {   
    var map = new Map;   
    for(var prop in obj) {   
        if(foreignKeys || obj.hasOwnProperty(prop)){  
            map.put(prop, obj[prop]);   
        }   
    }   
    return map;   
};   
/** 
 * 禁用map 
 * @return 
 */  
Map.prototype.disableLinking = function() {   
    this.link = Map.noop;   
    this.unlink = Map.noop;   
    this.disableLinking = Map.noop;   
    this.next = Map.illegal;   
    this.key = Map.illegal;   
    this.value = Map.illegal;   
    this.clear = Map.illegal;   
    return this;   
};   
/** 
 * 返回hash值 例如:number 123 
 * @param value key/value 
 * @return 
 */  
Map.prototype.hash = function(value) {   
    return (typeof value) + ' ' + (value instanceof Object ? (value.__hash || (value.__hash = ++arguments.callee.current)) : value.toString());   
};   
/** 
 * 返回map的长度 
 * @return 
 */  
Map.prototype.size = function() {   
    return this._size;  
};   
  
Map.prototype.hash.current = 0;   
/** 
 * 通过key获取value 
 * @param key 
 * @return 
 */  
Map.prototype.get = function(key) {   
    var item = this[this.hash(key)];   
    return item === undefined ? undefined : item.value;   
};   
/** 
 * 向map中添加数据 
 * @param key 键 
 * @param value 值 
 * @return 
 */  
Map.prototype.put = function(key, value) {   
    var hash = this.hash(key);   
    if(this[hash] === undefined) {   
        var item = { key : key, value : value };   
        this[hash] = item;   
        this.link(item);   
        ++this._size;   
    }else{  
        this[hash].value = value;  
    }   
    return this;   
};   
/** 
 * 通过key删除数据 
 * @param key 
 * @return 
 */  
Map.prototype.remove = function(key) {   
    var hash = this.hash(key);   
    var item = this[hash];   
    if(item !== undefined) {   
        --this._size;   
        this.unlink(item);   
        delete this[hash];   
    }   
    return this;   
};   
/** 
 * 清除map 
 * @return 
 */  
Map.prototype.clear = function() {   
    while(this._size){  
        this.remove(this.key());   
    }   
    return this;   
};   
/** 
 * 处理队列 
 * @param item 
 * @return 
 */  
Map.prototype.link = function(item) {   
    if(this._size == 0) {   
        item.prev = item;   
        item.next = item;   
        this.current = item;   
    }else {   
        item.prev = this.current.prev;   
        item.prev.next = item;   
        item.next = this.current;   
        this.current.prev = item;  
    }   
};   
Map.prototype.unlink = function(item) {   
    if(this._size == 0){   
        this.current = undefined;  
    }else {   
        item.prev.next = item.next;   
        item.next.prev = item.prev;   
        if(item === this.current){  
            this.current = item.next;   
        }   
    }   
};   
/** 
 * 获取下一个 
 * @return 
 */  
Map.prototype.next = function() {   
    this.current = this.current.next;   
    return this;  
};   
/** 
 * 获取key 
 * @return 
 */  
Map.prototype.key = function() {   
    return this.current.key;   
};   
/** 
 * 获取value 
 * @return 
 */  
Map.prototype.value = function() {   
    return this.current.value;   
};   
 测试代码如下:var l=10000;  
    var map=new Map();  
    var start=new Date().getTime();  
    for(var i=0;i<l;i++){  
        map.put("key_"+i,new Date());  
    }  
    var end=new Date().getTime();  
    document.write("向map中添加了  "+l+" 个Date对象..........");  
    document.write("<br/>");  
    document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());  
    document.write("<br/>");  
    document.write("在map中提取全部数据..........");  
    document.write("<br/>");  
    start=new Date().getTime();  
    for(var i=0;i<map.size();i++){  
        map.get("key_"+i).getTime();  
    }  
    end=new Date().getTime();  
    document.write("耗时  "+(end-start)+" 毫秒");  
    document.write("<br/>");  
    document.write("清空map..........");  
    document.write("<br/>");  
    start=new Date().getTime();  
    map.clear();  
    end=new Date().getTime();  
    document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());  
    document.write("<br/>");  

 使用next:

var map=new Map();  
    map.put("key_1","value_1");  
    map.put("key_2","value_2");  
    map.put("key_3","value_3");  
    var m=map.next();  
    document.write("map.next:key="+m.key()+" value="+m.value());  
    document.write("<br/>");  
    m=map.next();  
    document.write("map.next:key="+m.key()+" value="+m.value());  

 结果:

 

map.next:key=key_2 value=value_2  
map.next:key=key_3 value=value_3   
 
分享到:
评论

相关推荐

    js 实现map的方式

    JavaScript中的Map对象是一种数据结构,它允许我们存储键值对,并且键可以是任何类型,而不仅仅是字符串。Map对象在JavaScript ES6版本中被引入,为处理复杂的数据关联提供了更强大的工具,尤其对于那些需要使用非...

    使用js实现map功能

    使用js实现map工具类

    利用js实现Map

    本文将深入探讨`Map`对象的原理、特性以及如何通过JavaScript实现`Map`的相关功能,并通过实例进行演示。 ### 1. Map的基本用法 创建一个`Map`对象非常简单,可以通过传入一个数组的数组来初始化,每个内部数组...

    javascript实现map功能极其方便

    javascript实现map,极其方便,可在需要当前页处理多数据时使用

    js实现map用法

    JavaScript中的Map对象是ES6引入的一种新的数据结构,它提供了键值对的存储方式,与对象类似但有显著区别。Map的主要优势在于键可以是任意类型,而不仅仅是字符串,这使得它在处理复杂数据结构时非常有用。在本文中...

    用js实现map功能

    * Map对象,实现map功能 * put(key, value) 向map中增加键值对 * 例子: * var map = new Map(); * * map.put("key", "value"); * var val = map.get("key");

    JavaScript实现Array(数组)和Map

    `object.js` 文件可能涉及到的是JavaScript对象的操作,虽然不是直接与Array或Map相关,但它们在JavaScript中是重要的数据结构。JavaScript对象是一种键值对的集合,键通常是字符串,但也可以是符号(Symbol)。与...

    js模拟list和map

    javascript 模拟 java中的 List,Map js文件为 js/utils.js IE6.0 测试通过 &lt;br&gt;List: add(var obj) //添加一个元素 remove(var index) //删除一个元素 get(var index) //获取一个元素 remove...

    用javaScript实现的map,经过测试,很好用

    本文将深入探讨如何使用JavaScript实现Map,以及它的特性和优势。 首先,创建一个Map对象非常简单,可以通过调用Map构造函数并传入可迭代对象(如数组)来初始化: ```javascript let map = new Map([[1, 'one'], ...

    JavaScript 实现Array(数组)和Map

    在`map.js`文件中,可能会有对Map的实现或扩展,比如添加一个`forEach`方法遍历Map的所有键值对,或者一个`size`属性获取Map中的元素数量。 `object.js`文件可能包含与Object相关的辅助函数,比如深拷贝、属性检查...

    map的js实现

    本篇文章将深入探讨`Map`的JS实现,并通过提供的`map.js`文件来理解其内部工作原理。 `Map`对象的主要特性包括: 1. **键的多样性**:与对象的键必须是字符串或符号不同,`Map`的键可以是任何JavaScript值。 2. **...

    javascript的Map实现(高性能)

    在本文中,我们将深入探讨一种高性能的JavaScript `Map`实现,它基于JSON,具有出色的稳定性和更高的容量。 首先,我们来看传统的JavaScript `Map`。原生的`Map`提供了如`set`、`get`、`delete`、`has`等方法,便于...

    用JS对象实现map功能与方法

    部分IE浏览器不支持ecmascript 6,无法使用map对象,用原生js对象实现map功能

    在JavaScript中实现map对象

    ### 在JavaScript中实现Map对象 #### 一、引言 在JavaScript中,原生支持了多种数据结构,其中数组(Array)是最为常见的数据结构之一。然而,在某些应用场景下,我们可能需要一种能够根据键(key)快速查找值(value)的...

    js实现类似于JAVA的Map的封装

    通过JS的使用,实现类似于JAVA中Map的操作

    Java实现Map集合二级联动示例

    在这个"Java实现Map集合二级联动示例中国省市例子"中,我们将探讨如何使用Map来构建一个二级联动的功能,常见于如中国省市选择的场景。这个场景通常出现在需要用户首先选择省份,然后根据所选省份展示对应的市的选择...

    Javascript 中类似Map集合的实现键值对

    **自定义实现Map的思路** 1. **数据结构**:首先,我们需要一个数据结构来存储键值对,可以使用数组或对象。数组可以按照特定格式(如[key, value])存储,而对象则需要处理键的唯一性。 2. **size属性**:维护一...

    js中Map应用

    ### JavaScript中的Map应用 在JavaScript中,`Map`对象是一种内置的数据结构,它保存键值对,并且可以按插入顺序记住元素。与普通的JavaScript对象不同的是,`Map`的键可以是任何类型的值(不仅仅是字符串或符号)...

    javascript 实现map集合

    前几天项目上想用map集合一样的东西,简单拿对象拼了一下子,今天闲的慌实现一下 大家不要见笑 代码 var Map = function (){ /************基础变量**************/ var hashmap = {}; var keys = []; var vals...

    JavaScript中利用Array和Object实现Map的方法

    主要介绍了JavaScript中利用Array和Object实现Map的方法,实例分析了javascript实现map的添加、获取、移除、清空、遍历等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics