您的位置:首页 > Web前端 > JavaScript

JS中实现简单实用的HashMap

2015-07-31 17:28 337 查看
js中其实是有map这种特性的,但是不是非常好用。无意中在guirudaoge博主的文章(http://blog.csdn.net/guirudaoge/article/details/8433559)中看到其实现方式,觉得写的不错,在这里对其表示敬意,同时本人在项目中加以修改,以做分享!

原文代码为:

function HashMap(){
var size = 0;// Map大小
var entry = new Object();// 对象

// Map的存put方法
this.put = function(key, value) {
if (!this.containsKey(key)) {
size++;
entry[key] = value;
}
}

// Map取get方法
this.get = function(key) {
return this.containsKey(key) ? entry[key] : null;
}

// Map删除remove
this.remove = function(key) {
if (this.containsKey(key) && (delete entry[key])) {
size--;
}
}

// 是否包含Key
this.containsKey = function(key) {
return (key in entry);
}
// 是否包含Value
this.containsValue = function(value) {
for ( var prop in entry) {
if (isObjectValueEqual(entry[prop], value)) {
return true;
}
}
return false;
}

// 所有的Value
this.values = function() {
var values = new Array();
for ( var prop in entry) {
values.push(entry[prop]);
}
return values;
}

// 所有的 Key
this.keys = function() {
var keys = new Array();
for ( var prop in entry) {
keys.push(prop);
}
return keys;
}

// Map size
this.size = function() {
return size;
}

// 清空Map
this.clear = function() {
size = 0;
entry = new Object();
}
}


其实对于一般的需求,这已经可以了!修改之后的代码:

/*
*hashmap 1.0.0
* description:this haspmap is a data structure which is used in the js file and it can be store data whatever you want.
*
*/

var HashMap=function(){

var size = 0;// Map大小
var entry = new Object();// 对象

this.common=new common(); //取得common的通用方法

// Map的存put方法
this.put = function(key, value) {
if (!this.containsKey(key)) {
size++;
entry[key] = value;
}
}

// Map取get方法
this.get = function(key) {
return this.containsKey(key) ? entry[key] : null;
}

// Map删除remove
this.remove = function(key) {
if (this.containsKey(key) && (delete entry[key])) {
size--;
}
}

// 是否包含Key
this.containsKey = function(key) {
return (key in entry);
}
// 是否包含Value
this.containsValue = function(value) {
for ( var prop in entry) {
if (isObjectValueEqual(entry[prop], value)) {
return true;
}
}
return false;
}

// 所有的Value
this.values = function() {
var values = new Array();
for ( var prop in entry) {
values.push(entry[prop]);
}
return values;
}

// 所有的 Key
this.keys = function() {
var keys = new Array();
for ( var prop in entry) {
keys.push(prop);
}
return keys;
}

// Map size
this.size = function() {
return size;
}

// 清空Map
this.clear = function() {
size = 0;
entry = new Object();
}

// 获取key By value
this.getKeyByValue = function(value) {
for ( var prop in entry) {
if (this.common.isObjectValueEqual(entry[prop], value)) {
console.log("getKeyByValue is ok");
return prop;
}
}
return null;
}

// 包含特定字段对象的所有keys
this.specialKeys = function(containsID) {
var keys = new Array();
var object_container = new Array();
var values = this.values();
for (var i = 0; i < values.length; i++) {
console.log(this.common.isPropertyInObject(values[i], containsID));
if (this.common.isPropertyInObject(values[i], containsID)) {
object_container.push(values[i]);
}
}
console.log("object_container.length", object_container.length);
for (var j = 0; j < object_container.length; j++) {
keys.push(this.getKeyByValue(object_container[j]));
}
return keys;
}

// 查找一个弱对象是否存在于哈希表中
this.findWeekObjectInHash = function(obj) {
var values = this.values();
for (var i = 0; i < values.length; i++) {
if (this.common.isObjectValueEqualIgnoreSequence(obj, values[i])) {
return true;
}
}
return false;
}

// 包含对象特定字段的所有keys
this.specialKeysSequence = function(containsID, start_end) {
var keys = new Array();
var object_container = new Array();
var values = this.values();
for (var i = 0; i < values.length; i++) {
if (this.common.isPropertyValueInAndEqualObjectPropertyValue(values[i],
start_end, containsID)) {
object_container.push(values[i]);
}
}
for (var j = 0; j < object_container.length; j++) {
keys.push(this.getKeyByValue(object_container[j]));
}
return keys;
}

// 根据对象中是否包含某一属性值去查找hashmap的该value(即该对象)
this.findObjectByPropety = function(ID) {
var value = this.values();
for (var i = 0; i < value.length; i++) {
if (this.common.isPropertyInObject(value[i], ID)) {
return value[i];
}
}
return null;
}
}


其中common对象如下

var common=function(){

// 判断两个对象是否相等
this.isObjectValueEqual=function (a, b) {
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
if (a[propName] !== b[propName]) {
return false;
}
}
return true;
}

/*
* @description:弱判断两个对象是否相等(忽略属性的先后顺序,只要值相等 @example:A.x=1,A.y=2与A.x=2,A.y=1视为相等
*
*/
this.isObjectValueEqualIgnoreSequence=function (a, b) {
var flag = true;
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
if (!isPropertyInObject(b, a[aProps[i]])) {
flag = false;
}
}
return flag;
}

// 判断一个属性值是不是在一个对象里
this.isPropertyInObject=function (object, value) {
for ( var i in object) {
if (object[i] == value) {
return true;
}
}
return false;
}

// 判断一个属性值是不是与一个对象的指定属性值相等
this.isPropertyValueInAndEqualObjectPropertyValue=function (object, prop, value) {
if (prop in object) {
if (object[prop] == value) {
return true;
}
}
return false;
}

// 根据一个属性值找对象中另外一个属性值
this.FindPropertyValueInObjectWithOtherPropertyValue=function (object, prop1,
prop2, value) {
if (prop1 in object) {
if (object[prop1] == value) {
return object[prop2];
}
}
return false;
}
}


参考博文:http://blog.csdn.net/guirudaoge/article/details/8433559
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: