serendipityApe / javascriptPromotion

资深前端必备的编码问题
3 stars 0 forks source link

实现一个DOM元素储存 #20

Open serendipityApe opened 2 years ago

serendipityApe commented 2 years ago

题目

Create a simple store for DOM element

例子

JavaScript中有Map,我们可以用任何data做key,即便是DOM元素。

const map = new Map()
map.set(domNode, somedata)

如果运行的JavaScript不支持Map,我们如何能让上述代码能够工作?

请在不利用Map的条件下实现一个Node Store,支持DOM element作为key。

class NodeStore {

  set(node, value) {

  }

  get(node) {

  }

  has(node) {

  }
}

你可以实现一个通用的Map polyfill。或者利用以下DOM元素的特性来做文章?

请注意时间空间复杂度。

答案

//没啥难度,挺简单的这题
class NodeStore {
   /**
   * @param {Node} node
   * @param {any} value
   */
  constructor(){
    this.size=0;
    this.values=[];
  }
  set(node, value) {
    node.__mapId__=this.size++;
    this.values[this.size-1]=value;
  }
  /**
   * @param {Node} node
   * @return {any}
   */
  get(node) {
    let id=node.__mapId__;
    return this.values[id];
  }

  /**
   * @param {Node} node
   * @return {Boolean}
   */
  has(node) {
    let id= node.__mapId__;
    return this.size >= id;
  }
}