字典map

Posted XTTX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典map相关的知识,希望对你有一定的参考价值。

字典

字典和集合很相似,集合以[值,值]的形式存储元素,字典则是以[键,值]的形式来存储元素

实现Dictionary

function defaultToString(item){
    // 将键转化为字符串
    if(item === null){
        return \'NULL\'
    }else if(item === undefined){
        return \'UNDEFINED\'
    }else{
        return item.toString()
    }

}

class valuePair{
   // 键值对 constructor(key, value){
this.key = key this.value = value } toString(){ return `[#${this.key}: ${this.value}]` } } class Dictionary{ constructor(toStrFn = defaultToString){ this.toStrFn = toStrFn // 键转化为字符串 this.table = {} } hasKey(key){ return this.table[this.toStrFn[key]] !== undefined } set(key, val){ // 添加新元素 if(key !== null && val !== null){ const strKey = this.toStrFn(key) this.table[strKey] = new valuePair(key, val) return true } return false } remove(key){ if (this.hasKey(key)) { delete this.table[this.toStrFn(key)] return true } return false } get(key){ const value = this.table[this.toStrFn(key)] return value === undefined ? null : value.value } keyValues(){ // 返回所有键值对组成的数组 // Object.values(obj): Returns an array of values of the enumerable properties of an object return Object.values(this.table) } keys(){ // 返回所有键组成的数组 return this.keyValues().map((val) => { return val.key }) } values(){ // 返回所有值组成的数组 return this.keyValues().map((val) => { return val.value }) } forEach(callbackFn){ // 传入一个函数,参数为(key, value),迭代数组中的每个键值对运行 const valuePair = this.keyValues() for(let i=0; i<valuePair.length; i++){ const result = callbackFn(valuePair[i].key, valuePair[i].value) if (result === false) { break // 出错立即停止 } } } size(){ return Object.keys(this.table).length } isEmpty(){ return this.size() === 0 } clear(){ this.table = {} } toString(){ if(this.isEmpty()){ return "" } const valuePairs = this.keyValues() let objString = `${valuePairs[0].toString()}` for(let i=1; i<this.size(); i++){ objString = `${objString},${valuePairs[i].toString()}` } return objString } }

原生Map类

const map = new Map()
map.set("a","aa")
map.set("b","bb")
map.set("c","cc")

console.log(map.has("b"))   // true
console.log(map.size)       // 3

// 和我们定义的 Dictionary 类不同,ES2015 的 Map 类的 values 方法和 keys 方法都返回Iterator
console.log(map.keys())     // [Map Iterator] { \'a\', \'b\', \'c\' }
console.log(map.values())   // [Map Iterator] { \'aa\', \'bb\', \'cc\' }

console.log(map.get("c"))   // cc
map.delete(\'c\')  // 删除

WeakMap 和 WeakSet

除了 Set 和 Map 这两种新的数据结构,ES2015还增加了它们的弱化版本,WeakSet 和 WeakMap
基本上,Map 和 Set 与其弱化版本之间仅有的区别是:
  1. WeakSet 或 WeakMap 类没有 entries、keys 和 values 等方法
  2. 只能用对象作为键。
创建和使用这两个类主要是为了性能。WeakSet 和 WeakMap 是弱化的(用对象作为键),没有强引用的键,这使得 javascript 的垃圾回收器可以从中清除整个入口。
另一个优点是,必须用键才可以取出值,这些类没有 entries、keys 和 values 等迭代器方法,因此,除非你知道键,否则没有办法取出值,所以可以使用WeakMap类封装私有属性。
// 例:
const weakMap = new WeakMap()
const obj1 = {"name": "1"}
const obj2 = {"name": "2"}
const obj3 = {"name": "3"}

map.set(obj1, "111")
map.set(obj2, "222")
map.set(obj3, "333")

console.log(map.has(obj1))      // true
console.log(map.get(obj3))      // 333
map.delete(obj2)                // 删除

 

以上是关于字典map的主要内容,如果未能解决你的问题,请参考以下文章

Python snippet(代码片段)

Python代码阅读(第19篇):合并多个字典

CSP核心代码片段记录

统计难题HDU - 1251map打表或字典树字典树模板

RecyclerView holder中的Android Google Maps动态片段

将多个输出中的hls属性设置为单独的片段代码