为了账号安全,请及时绑定邮箱和手机立即绑定

如何用Object实现Map数据结构

如何用Object实现Map数据结构

波斯汪 2018-08-14 18:30:52
如题。map数据结构和object有一个区别是Map可以将任意类型值作为key,例如对象,函数。请问用ES5的对象该如何实现?
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

function reDefineValueOf(key) {

  const private = {};

  const baseValueOf = key.valueOf;

  function valueOf(n) {

    if (arguments.length > 0) {

      if (!(n in private)) {

        private[n] = {};

      }

      return private[n];

    }

    return baseValueOf.apply(this, arguments)

  }

  Object.defineProperty(key, 'valueOf', {

    value: valueOf,

    configurable: true,

    writable: true,

    enumerable: false

  })


}


function map() {

  //通过count来解决,不同map对象,用相同对象作key的情况

  const count = map.count++;

  function getKey(key) {

    if (key.valueOf.length !== 0) {

      return key.valueOf(count)

    }

    reDefineValueOf(key)

    return key.valueOf(count);

  }

  this.get = function (key) {

    return getKey(key).value;

  }

  this.set = function (key, value) {

    getKey(key).value = value;

  }

}

map.count = 0;

var c = { c: 1 }

var a = new map();

var b = new map();

a.set(c, 'a')

b.set(c, 'b')


console.log(a.get(c));

console.log(b.get(c));

核心思想是,既然key是对象,那么就给key对象新增一个函数,这个函数返回的值就是我们当时设置的值。然而由于可能出现不同的map对象,用相同的对象作key值的情况,这里给每一个map对象加了一个count计数器,用来作为map对象的id,以此作为key对象查找的一个依据。

查看完整回答
反对 回复 2018-08-19
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

proxy getter

查看完整回答
反对 回复 2018-08-19
  • 2 回答
  • 0 关注
  • 735 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信