/*
* 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();
}
}