基于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();

    }

}

你可能感兴趣的:(JavaScript)