js实现hashtable的赋值、取值、遍历操作实例详解


Posted in Javascript onDecember 25, 2016

本文实例讲述了js实现hashtable的赋值、取值、遍历操作。分享给大家供大家参考,具体如下:

哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值、取值、遍历、排序操作提高效率。想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面的出现最多的次数,那么这里我们可能就要用Hashtable的相关知识了。Javascript中,object的实现就是hash表,因此只要在object上封装点方法,再利用原生的hasOwnProperty方法就可以实现简单高效的hashtable。

一、什么是哈希表(Hashtable)

二、哈希表的简单操作

三、js模拟哈希表的简单操作

一、什么是哈希表(Hashtable)

Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。

js实现hashtable的赋值、取值、遍历操作实例详解

二、哈希表的简单操作C#

在哈希表中添加一个key/value键值对:

HashtableObject.Add(key,value);

在哈希表中去除某个key/value键值对:

HashtableObject.Remove(key);

从哈希表中移除所有元素:

HashtableObject.Clear();

判断哈希表是否包含特定键key:

HashtableObject.Contains(key);

三、js模拟哈希表的简单操作

HashTable.prototype = {
    contructor:HashTable,
    //初始化
    initialize:function(){
      this.obj = {};
    },
    //获取hashTable中对象唯一出现的次数
    count:function(){
      var count = 0;
      for(var i in this.content) count++;
      return count;
    },
    //返回hashTable中的值
    items:function(key){
      if(this.contains(key)){
        return this.obj[key];
      }
    },
    //增加值到hashtable
    add:function(key,value){
      if(this.obj.hasOwnProperty(key)){
        return false;
      }else{
        this.obj[key] = value;
        return true;
      }
    },
    //清空hashtable中的值
    clear:function(){
      this.obj = {};
    },
    //检测hashTable对象中是否含有此属性
    contains:function(key){
      return this.obj.hasOwnProperty(key);
    },
    //移除hashTable中对象的值
    remove:function(key){
      delete this.obj[key];
    }
}

这样我们就能像c#语言里面的那样进行操作了。

还一个简单的变体版:

// js哈希表
function HashTable() {
  this.ObjArr = {};
  this.Count = 0;
  //添加
  this.Add = function(key, value) {
    if (this.ObjArr.hasOwnProperty(key)) {
      return false; //如果键已经存在,不添加
    }else {
      this.ObjArr[key] = value;
      this.Count++;
      return true;
    }
  }
  //是否包含某项
  this.Contains = function(key) {
    return this.ObjArr.hasOwnProperty(key);
  }
  //取某一项 其实等价于this.ObjArr[key]
  this.GetValue = function(key){
    if (this.Contains(key)) {
      return this.ObjArr[key];
    }else {
      throw Error("Hashtable not cotains the key: " + String(key)); //脚本错误
      //return;
    }
  }
  //移除
  this.Remove = function(key) {
    if (this.Contains(key)) {
      delete this.ObjArr[key];
      this.Count--;
    }
  }
  //清空
  this.Clear = function(){
    this.ObjArr = {}; this.Count = 0;
  }
}
//员工
function employee(id, userName) {
  this.id = id;
  this.userName = userName;
}
function test() {
  var ht = new HashTable();
  var tmpEmployee = null;
  for (var i = 1; i < 6; i++) {
    tmpEmployee = new employee(i, "Employee_" + i);
    ht.Add(i, tmpEmployee);
  }
  for (var i = 1; i <= ht.Count; i++) {
    alert(ht.GetValue(i).userName); //其实等价于ht.ObjArr[i].userName
    //alert(ht.ObjArr[i].userName);
  }
  ht.Remove(1);
  alert(ht.Contains(1)); //false
  alert(ht.Contains(2)); //true
  //alert(ht.GetValue(1)); //异常
  var result = ht.GetValue(2);
  if (result != null) {
    alert("Employee Id:" + result.id + ";UserName:" + result.userName);
  }
  ht.Add(2, "这一个key已经存在!"); //Add无效
  //ht.Clear(); //清空
  alert(ht.Count);
}

最后解决一下,开头说的那个问题

Array.prototype.maxNum = function(){
  var arr = this,obj={};
  for(var i =0, len=arr.length;i<len;i++){
    var key = arr[i];
    if( ! obj[key]){
      obj[key] = 1;
    }else{
      obj[key]++;
    }
  }
  var max = -1,maxStr;
  for( key in obj){
    if(obj[key]>max){
      max = obj[key];
      maxStr = key;
    }
  }
  //alert(maxStr);
  return [maxStr,max];
}
Javascript 相关文章推荐
JavaScript的面向对象(二)
Nov 09 Javascript
js隐式全局变量造成的bug示例代码
Apr 22 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
May 19 Javascript
javascript返回顶部的按钮实现方法
Jan 09 Javascript
20分钟打造属于你的Bootstrap站点
Jul 27 Javascript
bootstrap 表单验证使用方法
Jan 11 Javascript
解决webpack打包速度慢的解决办法汇总
Jul 06 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
Aug 10 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
vue点击按钮动态创建与删除组件功能
Dec 29 Javascript
vue-cli3单页构建大型项目方案
Apr 07 Javascript
原生js实现下拉框选择组件
Jan 20 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
Dec 25 #Javascript
AngularJS入门教程之Helloworld示例
Dec 25 #Javascript
jQuery实现圣诞节礼物动画案例解析
Dec 25 #Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 #Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 #Javascript
使用jsonp实现跨域获取数据实例讲解
Dec 25 #Javascript
JavaScript中数据类型转换总结
Dec 25 #Javascript
You might like
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
JavaScript表单常用验证集合
2008/01/16 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
javascript 缓冲运动框架的实现
2017/09/29 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
python网络编程之数据传输UDP实例分析
2015/05/20 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
模具设计与制造专业推荐信
2014/02/16 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
小学家长通知书评语
2014/12/31 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
简历自我评价范文
2019/04/24 职场文书