`

基于Array实现并扩展MAP功能

阅读更多

/*

 * MAP对象,基于Array实现并扩展MAP功能

 *

 * 方法说明:

 * size()      获取map元素个数

 * isEmpty()   判断map是否为空

 * clear()     删除map所有元素

 * push(key, value)   向map中增加元素(key, value),顺序的

 * remove(key)    删除指定key的元素,成功返回True,失败返回False

 * get(key)    获取指定key的元素值value,失败返回NULL

 * element(index)   获取指定索引的元素(使用element.key,element.value获取key和value),失败返回NULL

 * containsKey(key)  判断map中是否含有指定key的元素

 * containsKeyIgnoreCase(key)  判断map中是否含有指定key的元素(忽略大小写)

 * containsValue(value) 判断map中是否含有指定value的元素

 * values()    获取map中所有value的数

 * uniqueValues() 获取map中所有VALUE的数组,唯一的value

 * keys()     获取map中所有key的数

 * sort()     map排序,按照push的顺序

 * inverse()  map排序,按照push的顺序倒序

 * randomKey()  随机一个key

 * randomValue()  随机一个value

 * randomEntry()   随机一个key-value

 * 

 * 使用例子:

 * var map = new Map();

 * map.push("key", "value");

 * var val = map.get("key");

 * map.containsValue("val");

 * map.inverse();

 * readme: 建议使用字符串作为key

 */

function Map() {

 

//实例化一个数组

    this.elements = new Array();

 

    //获取MAP元素个数

    this.size = function () {

        return this.elements.length;

    }

 

    //判断MAP是否为空

    this.isEmpty = function () {

        return (this.elements.length < 1);

    }

 

    //删除MAP所有元素

    this.clear = function () {

        this.elements = new Array();

    }

 

    //向MAP中增加元素(key, value)

    this.push = function (_key, _value) {

        //判断是否存在key

        if (this.containsKey(_key)) {

            return;

        }

        this.elements.push({

            key: _key,

            value: _value

        });

    }

 

    //向MAP中从右边删除元素

    this.pop = function () {

        return this.elements.pop();

    }

 

    //向MAP中从左边删除元素

    this.shift = function () {

        return this.elements.shift();

    }

 

    //删除指定KEY的元素,成功返回True,失败返回False

    this.remove = function (_key) {

        var bln = false;

        //判断是否存在key

        if (!this.containsKey(_key)) {

            return bln;

        }

        try {

            //遍历数组

            for (i = 0; i < this.elements.length; i++) {

                if (this.elements[i].key == _key) {

                    //从数组中移除

                    this.elements.splice(i, 1);

                    return true;

                }

            }

        } catch (e) {

            console.log(e);

        }

        return bln;

    }

 

    //获取指定KEY的元素值VALUE,失败返回NULL

    this.get = function (_key) {

        var result = null;

        try {

            for (var i = 0; i < this.elements.length; i++) {

                if (this.elements[i].key == _key) {

                    return this.elements[i].value;

                }

            }

        } catch (e) {

            console.log(e);

        }

        return result;

    }

 

 

    //获取指定索引的元素(使用element.key,element.value获取KEY和VALUE),失败返回NULL

    this.element = function (_index) {

        //判断下标是否存在

        if (isNaN(_index) || _index < 0 || _index >= this.elements.length) {

            return null;

        }

        try {

            return this.elements[_index];

        } catch (e) {

            console.log(e);

        }

        return null;

    }

 

    //判断MAP中是否含有指定KEY的元素

    this.containsKey = function (_key) {

        var bln = false;

        try {

            for (var i = 0; i < this.elements.length; i++) {

                if (this.elements[i].key == _key) {

                    bln = true;

                }

            }

        } catch (e) {

            console.log(e);

        }

        return bln;

    }

 

    //判断MAP中是否含有指定KEY的元素(忽略大小写)

    this.containsKeyIgnoreCase = function (_key) {

        var bln = false;

        try {

            for (var i = 0; i < this.elements.length; i++) {

                if ((this.elements[i].key+"").toLowerCase() == (_key+"").toLowerCase()) {

                    bln = true;

                }

            }

        } catch (e) {

            console.log(e);

        }

        return bln;

    }

 

 

    //判断MAP中是否含有指定VALUE的元素

    this.containsValue = function (_value) {

        var bln = false;

        try {

            for (i = 0; i < this.elements.length; i++) {

                if (this.elements[i].value == _value) {

                    bln = true;

                }

            }

        } catch (e) {

            console.log(e);

        }

        return bln;

    }

 

    //获取MAP中所有VALUE的数组(ARRAY)

    this.values = function () {

        var arr = new Array();

        for (var i = 0; i < this.elements.length; i++) {

            arr.push(this.elements[i].value);

        }

        return arr;

    }

 

    //获取MAP中所有VALUE的数组(唯一的 ARRAY)

    this.uniqueValues = function () {

        var arr = new Array();

        for (var i = 0; i < this.elements.length; i++) {

            var v = this.elements[i].value;

            //判断数组中是否存在

            if (arr.indexOf(v) < 0) {

                arr.push(v);

            }

        }

        return arr;

    }

 

    //获取MAP中所有KEY的数组(ARRAY)

    this.keys = function () {

        var arr = new Array();

        for (var i = 0; i < this.elements.length; i++) {

            arr.push(this.elements[i].key);

        }

        return arr;

    }

 

    //获取MAP中所有KEY-VALUE 的数组(ARRAY)

    this.toString = function () {

        var arr = new Array();

        for (var i = 0; i < this.elements.length; i++) {

            arr.push(this.elements[i].key+":"+this.elements[i].value);

        }

        return arr;

    }

 

    //生成随机数

    this.randomNum = function (size) {

        var size = this.elements.length;

        var num = parseInt(Math.random() * size);

        return num;

    }

 

    //随机一个key

    this.randomKey = function () {

        var randomNum = this.randomNum;

        return this.elements[randomNum].key;

    }

 

    //随机一个value

    this.randomValue = function () {

        var randomNum = this.randomNum;

        return this.elements[randomNum].value;

    }

 

    //随机一个元素(map)

    this.randomEntry = function () {

        var randomNum = this.randomNum;

        return this.elements[randomNum];

    }

 

    //map反转,按照push的顺序反转

    this.inverse = function(){

        this.elements.reverse();

    }

 

//map排序,按照push的顺序

    this.sort = function(){

        this.elements.sort();

    }

}

分享到:
评论

相关推荐

    js Map 工具类 MapUtil

    在JavaScript的世界里,`Map`对象是一个非常重要的数据结构,它允许我们存储键值对,其中键可以是任何类型的...在阅读`MapUtil.js`源码时,可以关注这些方法的实现细节,理解它们如何优化和扩展了原生`Map`对象的能力。

    基于HAMT的小型单文件可扩展密钥值存储

    【标题】"基于HAMT的小型单文件可扩展密钥值存储" 提示我们讨论的是一个使用哈希映射数组多重表(Hash Array Mapped Trie,简称HAMT)实现的轻量级、单文件且可扩展的键值存储系统。这种存储方案常用于JavaScript...

    FPMR:FPGA 实现 Map Reduce

    ### FPGA 实现 Map Reduce(FPMR):加速与优化 #### 概述 随着机器学习和数据挖掘在计算领域获得越来越多的关注,寻找高效、低功耗且灵活的硬件平台成为了一个紧迫的需求。FPGA(Field Programmable Gate Array)...

    ImmutableArray原型方法Per方法包的集合

    `ImmutableArray`是实现这一概念的一个库,它扩展了JavaScript原生数组,提供了额外的方法来操作数组,同时保持其不可变性。在“Immutable Array原型方法(Per方法包)的集合”中,我们关注的是一个名为`Per`的方法...

    refj-array-master

    从项目名和标签“nodejs array”我们可以推断,这个项目可能是为了提供一系列增强或扩展JavaScript原生数组功能的工具或者模块。在Node.js环境中,由于JavaScript的特性,数组操作在处理大量数据时可能会遇到性能...

    用于JavaScript的异步迭代器扩展库包括mapreducefilterflatMappipe等

    这个名为"axax"的扩展库正是针对JavaScript的异步迭代器进行了功能增强,提供了诸如map、reduce、filter、flatMap和pipe等实用方法,使得异步数据处理更加方便和高效。 首先,我们来了解下这些方法: 1. **异步Map...

    基于 fpga 的 turbo 码译码器的实现

    FPGA(Field-Programmable Gate Array)是可编程逻辑器件,可以灵活地实现各种数字逻辑功能,包括复杂的编码和解码算法。在本项目中,我们将深入探讨如何在FPGA上实现基于硬件的Turbo码译码器。 Turbo码是由两个或...

    ASP.NET AJAX深入浅出系列课程(7):Microsoft AJAX Library对于JavaScript原生对象的扩展(上)

    在Microsoft AJAX Library中,Array对象新增了诸如forEach、each、map、filter、some和every等方法,这些都是基于ECMAScript 5标准的迭代函数。这些新方法提供了更强大的数组操作能力,例如遍历、转换和筛选数组元素...

    js 数组工具类 ArrayUtil

    类似于`Array.prototype.map()`,`mapTo`可以遍历数组并将每个元素转换成新形式,但可能提供了更多的灵活性,如支持异步操作。 7. **数组拆分** (`chunk`) 这个方法可能会将一个大数组分割成若干个小数组,每个...

    NingArray宁数组一些实用的基于ES6的自定义数组方法

    宁数组(Ning·Array)是一组实用的基于ES6语法的自定义数组方法,它扩展了JavaScript原生数组的功能,提供了更为灵活和强大的数组操作工具。这些方法旨在简化常见的数组处理任务,提高代码的可读性和效率。下面将...

    js随机颜色代码的多种实现方式.docx

    #### 实现3:扩展数组原型并使用`map`函数 此方法涉及对JavaScript原生数组的`map`方法进行扩展,以方便生成随机颜色代码。 ```javascript // 扩展Array.prototype.map方法 Array.prototype.map = function (fn, ...

    js代码-005 ['1','2','3'].map(parseInt)一道题的扩展,实现map,call

    本文将深入探讨这两个方法,并基于题目中给出的示例 "['1','2','3'].map(parseInt)" 进行扩展,展示它们的实现方式以及如何在实际编程中应用。 `map()` 是一个数组方法,它创建一个新的数组,新数组中的元素是原始...

    JS中的forEach、$.each、map方法推荐

    为了实现兼容性,可以通过向`Array.prototype`扩展来添加这些方法,如下所示: ```javascript if (!Array.prototype.forEach) { Array.prototype.forEach = function(callback, thisArg) { // 实现forEach逻辑 }...

    基于JS前端开发的一个购物车案例

    本教程将聚焦于一个基于JS的购物车案例,旨在帮助学生和初学者深入理解和实践JavaScript在网页动态功能中的应用。 首先,让我们了解一下JavaScript的基础。JavaScript是一种解释型的、面向对象的、弱类型的脚本语言...

    开源项目-imiskolee-collection.zip

    1. `array_map`:对数组中的每个元素应用一个函数并返回新数组。 2. `array_filter`:根据指定的回调函数过滤数组元素。 3. `array_reduce`:通过遍历数组并将结果累加到单一的值上。 4. `array_walk`:对数组中的每...

    array:ctx核心数组

    1. **数组方法增强**:可能提供了对原生JavaScript数组方法的扩展,比如`map()`, `filter()`, `reduce()`等,以支持更复杂的操作或提供更好的性能。 2. **上下文感知**:'ctx'可能代表上下文(context),这个核心...

    JAVA中的集合和js中集合

    - **`HashMap`**:基于哈希表实现的`Map`接口,提供高效的键值对映射操作。 - **`TreeMap`**:基于红黑树实现的`Map`接口,能够按照键进行排序。 - **`LinkedList`** 和 **`ArrayList`**:分别适用于频繁插入/删除和...

    Java集合类List-Set-Map的区别和联系.doc

    首先,数组(Array)是最基础的数据结构,它允许我们存储固定数量的同类型元素,并通过索引进行访问。虽然数组效率高,但容量固定且不支持动态扩展,也无法直接获取已存储元素的数量。Java提供的`Arrays`类提供了...

    Java中的MapListSet等集合类.docx

    3. **SortedMap**:扩展了`Map`接口,提供了排序功能。 - **TreeMap**:基于红黑树实现的`SortedMap`,能够按照键的自然顺序或者自定义比较器进行排序。 4. **WeakHashMap**:键是弱引用的`Map`实现,适用于缓存...

    C++各种数据结构头文件,可以直接调用(含样例实现).rar

    7. **映射(Map)**:键值对的有序集合,`std::map`基于红黑树,`std::unordered_map`使用哈希表。 8. **向量(Vector)**:动态数组,提供高效随机访问,但插入和删除元素在非尾部时效率较低。C++标准库中的`std::...

Global site tag (gtag.js) - Google Analytics