JavaScript实现哈希表数据结构[通俗易懂]

一、简单说明1、JavaScript是没有哈希表数据结构的,那么当我们需要用到类似哈希表这样的键值对数据结构时怎么办?答案就是自己实现一个,我们可以利用JavaScript的一些特性来实现自己的哈希表数据结构。2、首先,哈希表是一种键值对数据结构,键是唯一的,这个特征跟JavaScript的Object对象有点类似,Object对象的属性是唯一的,属性和值的映射就像是键值对一样,那么我们可以用一个…

大家好,又见面了,我是你们的朋友全栈君。

一、简单说明

1、JavaScript是没有哈希表数据结构的,那么当我们需要用到类似哈希表这样的键值对数据结构时怎么办?答案就是自己实现一个,我们可以利用JavaScript的一些特性来实现自己的哈希表数据结构。

2、首先,哈希表是一种键值对数据结构,键是唯一的,这个特征跟JavaScript的Object对象有点类似,Object对象的属性是唯一的,属性和值的映射就像是键值对一样,那么我们可以用一个Object对象来代表键值对的存储,再加上一个size变量用来记录键值对的数量,这样简单的键值对存储结构就有了。

3、其次,哈希表有哪些常用的方法:

     put  ->  往哈希表放入一个键值对

     get  ->  从哈希表获取一个指定键的值

     remove  ->  从哈希表删除指定键关联的键值对

     getSize  ->  获取哈希表键值对数量

     clear  ->  清空哈希表中的所有键值对

     containsKey  ->  判断哈希表是否存在指定的键

     containsValue  ->  判断哈希表是否存在指定的值

     getKeys  ->  获取哈希表中所有的键列表

     getValues  ->  获取哈希表中所有键值对的值列表

4、上述第三点各个方法的实现如代码所示。

二、代码实现如下

/**
 * 实现哈希表的数据结构
 */
function HashTable() {
	var size = 0;
	var entry = new Object();
	
	// 增加键值对
	this.put = function(key, value) {
		// 已存在key则更新value,否则新增
		if (!this.containsKey(key)) {
			++size;
		}
		entry[key] = value;
	};
	
	// 获取键对应的值
	this.get = function(key) {
		return (this.containsKey(key) ? entry[key] : null);
	};

	// 删除指定键对应的值
	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 key in entry) {
			if (entry[key] == value) {
				return true;
			}
		}
		return false;
	};
	
	// 返回哈希表的所有key
	this.getKeys = function() {
		var keys = new Array();
		for (var key in entry) {
			keys.push(key);
		}
		return keys;
	};
	
	// 返回哈希表的所有value
	this.getValues = function() {
		var values = new Array();
		for (var key in entry) {
			values.push(entry[key]);
		}
		return values;
	};
	
	// 返回哈希表键值对数量
	this.getSize = function() {
		return size;
	};
	
	// 清空哈希表
	this.clear = function() {
		size = 0;
		entry = new Object();
	};
}


/*--- 以下为测试数据 ---*/

// 初始化一个hashTable对象
var hashtable = new HashTable();

// 打印hashTable的所有key
console.log(hashtable.getKeys());

// 打印hashTable的所有key
hashtable.put("name", "Edward");
hashtable.put("age", 5);

// 获取键值对数量
console.log(hashtable.getSize());
// 打印hashTable的所有key
console.log(hashtable.getKeys());

// 获取指定key的值
console.log(hashtable.get("name"));
console.log(hashtable.get("email"));

hashtable.clear();
// 获取键值对数量
console.log(hashtable.getSize());
// 打印hashTable的所有key
console.log(hashtable.getKeys());

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127348.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • WindowsclientC/C++编程规范“建议”——前言

    WindowsclientC/C++编程规范“建议”——前言

    2021年12月14日
  • leetcode 三数之和_leetcode数组

    leetcode 三数之和_leetcode数组原题链接给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[] 提示:0 <= nums.length <= 300

  • docker 离线安装_Docker安装

    docker 离线安装_Docker安装一.上传docker-offline-installer.tar并解压缩(1)tar-xvfdocker-offline-installer.tar如果在网上找不到docker-offline-installer.tar,可以在我的CSDN中点击[资源]去下载二.配置yum源(1)进入工作目录:cd/etc/yum.repos.d/(2)备份现有库源:mkdirrepo&&mv*.reporepo/…

  • matlab保存所有图,Matlab中图片保存的5种方法

    matlab保存所有图,Matlab中图片保存的5种方法matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的。Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf、mesh系类的数值绘图函数等几十个。另外其他专业工具箱也提供了专业绘图函数,这些值得大家深入学习好久。今天我只是讨论下如何保存这些由Matlab绘制出来的图像呢?当然借助第三方截图软件,就算了!1、使用imwrite函数如图像是img,则可以使用im…

  • kafka-logs_logstash kafka

    kafka-logs_logstash kafkaKafka的Log存储解析标签(空格分隔):kafka引言Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。借用官方的一张图,可以直观地看到topic和partit

    2022年10月14日
  • 比较spring cloud和dubbo,各自的优缺点是什么[通俗易懂]

    dubbo由于是二进制的传输,占用带宽会更少springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级dubbo的注册中心可以选择zk,redis等多种,sp…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号