亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用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 關注
  • 772 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號