学习js数据结构与算法-字典(2)

135 阅读2分钟

这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。

第二十二天:开始学习集合

  • set

    实现设置的方法,需要传入键和值

    set(key,value) {
      if(!this.has(key)){
        this.table[this.toStrFn(key)] = new ValuePair(key, value)
        this.count++
      }
      return this
    }
    

    如果字典里面没有当前数据,就往table里面去添加数据,最后返回这个实例。我们是以字符串去保存当前的数据的,所以我们还需要保存原来的键和值。

  • ValuePair类

    所以我们需要实现保存原来的健和值的类。

    class ValuePair {
      constructor(key, value) {
      this.key = key; 2
        this.value = value;
      }
      toString() {
        return `[#${this.key}: ${this.value}]`;
    } }
    
  • remove

    从字典中移除一个值

    remove(key) {
      if(this.hasKey(key)){
        delete this.table[this.toStrFn(key)]
        this.count--
      }
      return this
    }
    

    如果当前有这个值的话,才对table进行删除。

  • get

    从字典中找到一个值

    get(key) {
      if (this.hasKey(key)) {
        return this.table[this.toStrFn(key)];
      }
      return undefined;
    }
    

    如果有这个key就返回这个这个值,否则的话,直接返回undefined

  • keyValues

    keyValues方法是遍历出它的所有键和值

    keyValues() {
      return Object.values(this.table)
    }
    keyValues() {
      let result = []
      for(let i in this.table) {
        if(this.hasKey(i)) {
          result.push(this.table[i])
        }
      }
      return result
    }
    

    上面我们用了两种方式实现,第一种是直接使用es6的values方法,第二个种兼容性代码,遍历table,当前键有值就往数组里面添加,最后返回这个数组。我们用了hasKey防范,是因为对象的原型也会包含对象的其他属性。

  • keys

    keys方法是遍历出它的所有键

    values() {
      return this.keyValues().map(item => item.value)
    }
    

    在实现了keyValues方法的前提下,可以直接调用该方法,然后用map方法拼出所有的值

  • values

    values方法是遍历出它的所有值

    keys() {
      return this.keyValues().map(item => item.key)
    }
    

    同样的,直接调用keyValues方法,map方法拼出所有的键

  • forEach

    这个和es5的forEach差不多,但它的第一第二个参数分别是键和值

    forEach(callbackFn) {
          const valuePairs = this.keyValues();
          for (let i = 0; i < valuePairs.length; i++) {
            const result = callbackFn(valuePairs[i].key, valuePairs[i].value);
            if (result === false) {
              break; 
            }
    } }
    

    这里做了判断,如果传入的回调返回了false,就打断正在迭代的循环。

  • size

    一开始已经做了个count字段记录

    size() {
      return this.count
    }
    
  • isEmpty

    判断该字典是否为空

    isEmpty() {
      return this.size() === 0
    }
    
  • clear

    clear() {
      this.table = {};
    }
    

    清除该字典只需要把table置为空对象即可。

  • toString

     toString() {
            if (this.isEmpty()) { return ''; }
            const valuePairs = this.keyValues();
            let objString = `${valuePairs[0].toString()}`;
            for (let i = 1; i < valuePairs.length; i++) {
    objString = `${objString},${valuePairs[i].toString()}`;
            }
            return objString;
        }
         
    

    我们在ValuePair类中已经对key和value做了toString,所以只需要循环该字典,调用实例的toString()方法即可。