目录
哈希表的定义
对象与哈希表的区别
哈希值的方法
set方法,用于给键值赋值
let hash = new Map()
hash.set(bob, true) // Map(1) {bob => true}
get方法,获取某个键值对应的映射数据,返回数据
let hash = new Map()
hash.set(bob, true) // Map(1) {bob => true}
hash.get(bob) // true
hash.get(2) // 获取不存在键值的数据会返回undefined
has方法,判断是否存在某个键值,返回布尔值
hash.has(bob) // true
hash.has(89) // false
delete方法,删除键值
hash.delete(1) // 删除已有键值对
size属性, 获取哈希表键值对数量
hash.size // 2
运用的场景
场景1:数组去重
// 哈希表实现数组去重
/**
* @param {Array[]} oldArr
* @return {Array[]}
*/
var uniq = function (oldArr) {
// 增加代码的健壮性
if (!oldArr || !oldArr instanceof Array ) {
oldArr = []
}
let hash = new Map()
let newArr = []
for (let i = 0; i < oldArr.length; i++) {
if (!hash.get(oldArr[i])) {
newArr.push(oldArr[i])
hash.set(oldArr[i], 1)
}
}
return newArr
}
场景2:统计字符串中不同字符出现的次数
/**
* @param {string} str
* @return {Map}
*/
var statistics = function (str) {
if (!str.length) {
return
}
let hash = new Map()
// 分割字符串为数组
let tempArr = str.split('')
for (let i = 0; i < tempArr.length; i++) {
// 设置每个键值的映射数值,存在则+1,不存在则设置为1
hash.set(tempArr[i], (hash.get(tempArr[i]) || 0) + 1)
}
return hash
}
let str = 'abbbbcccccddddd'
statistics(str) // Map(4) {'a' => 1, 'b' => 4, 'c' => 5, 'd' => 5}
场景3:输出两个数组的交集,输出结果中的每个元素一定是 唯一 的
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
if (nums1.length === 0 || nums2.length === 0) {
return []
}
if (nums1.length < nums2.length) {
const temp = nums1;
nums1 = nums2;
nums2 = temp
}
let hasSet = new Set(nums1)
let resSet = new Set()
for (let i = 0; i < nums2.length; i++) {
hasSet.has(nums2[i]) && resSet.add(nums2[i])
}
return Array.from(resSet)
};