javascript实现hashMap
/* ===================================================================== @license MIT @author Daniel Kwiecinski <daniel.kwiecinski@lambder.com> @copyright 2009 Daniel Kwiecinski. @end ===================================================================== */var HashMap = function() { this.initialize();}HashMap.prototype = { hashkey_prefix: "<#HashMapHashkeyPerfix>", hashcode_field: "<#HashMapHashkeyPerfix>", initialize: function() { this.backing_hash = {}; this.code = 0; }, /* maps value to key returning previous assocciation */ put: function(key, value) { var prev; if (key && value) { var hashCode = key[this.hashcode_field]; if (hashCode) { prev = this.backing_hash[hashCode]; } else { this.code += 1; hashCode = this.hashkey_prefix + this.code; key[this.hashcode_field] = hashCode; } this.backing_hash[hashCode] = value; } return prev; }, /* returns value associated with given key */ get: function(key) { var value; if (key) { var hashCode = key[this.hashcode_field]; if (hashCode) { value = this.backing_hash[hashCode]; } } return value; }, /* deletes association by given key. Returns true if the assocciation existed, false otherwise */ del: function(key) { var success = false; if (key) { var hashCode = key[this.hashcode_field]; if (hashCode) { var prev = this.backing_hash[hashCode]; this.backing_hash[hashCode] = undefined; if(prev !== undefined) success = true; } } return success; }}//// Usage// creationvar my_map = new HashMap();// insertionvar a_key = {};var a_value = {struct: "structA"};var b_key = {};var b_value = {struct: "structB"};var c_key = {};var c_value = {struct: "structC"};my_map.put(a_key, a_value);my_map.put(b_key, b_value);my_map.put("1","one");my_map.put("1","one");var prev_b = my_map.put(b_key, c_value);// retrievalif(my_map.get(a_key) !== a_value){ throw("fail1")}if(my_map.get(b_key) !== c_value){ throw("fail2")}if(prev_b !== b_value){ throw("fail3")}// deletionvar a_existed = my_map.del(a_key);var c_existed = my_map.del(c_key);var a2_existed = my_map.del(a_key);if(a_existed !== true){ throw("fail4")}if(c_existed !== false){ throw("fail5")}if(a2_existed !== false){ throw("fail6")}