leetcode第576題引入js中Map和Object比較

Map對象是一種有對應 鍵/值 對的對象, Object也是 鍵/值 對的對象 ;都是用來存儲數據的一種結構,這兩個結構有什么比較的呢?

下面就引入leetcode第576題


image.png

代碼1

var findPaths = function(m, n, N, i, j) {
    const mod = Math.pow(10, 9) + 7
    let memo = {}    //對象
    let dfs = (i, j, k)=>{
        if(k<0) return 0
        if (i < 0 || i >= m || j < 0 || j >= n) {
            return 1
        }
        let key = `${i}-${j}-${k}`
        if(memo[key]) return memo[key]

        let res = 0
        res += dfs(i - 1, j, k - 1)
        res += dfs(i + 1, j, k - 1)
        res += dfs(i, j - 1, k - 1)
        res += dfs(i, j + 1, k - 1)
        res%=mod
        memo[key] = res
        return res
    }

    return dfs(i, j, N)
};

代碼2

var findPaths = function(m, n, N, i, j) {
    const mod = Math.pow(10, 9) + 7
    let memo = new Map() //map
    let dfs = (i, j, k)=>{
        if(k<0) return 0
        if (i < 0 || i >= m || j < 0 || j >= n) {
            return 1
        }
        let key = `${i}-${j}-${k}`
        if(memo.has(key)) return memo.get(key)

        let res = 0
        res += dfs(i - 1, j, k - 1)
        res += dfs(i + 1, j, k - 1)
        res += dfs(i, j - 1, k - 1)
        res += dfs(i, j + 1, k - 1)
        res%=mod
        memo.set(key, res)
        return res
    }

    return dfs(i, j, N)
};

我一開始使用是代碼一進行提交,每次都是timeout,到第八十多個用例時候死活過不了,然后就換了第二種方法,使用map做為備忘錄然后就
image.png

what fuck???map本質上也是繼承Object為什么使用map會比使用對象的效率好這么多?
然后翻了一下MDN對map的介紹也有對Map和Object的對比


image.png

從圖中可以看出Map 在很多時候優于 Object,但是作為 JavaScript 最基礎的數據類型,還是有很多情景更適合使用 Object。那再延伸一下什么時候使用Object,在什么時候使用Map更合適呢

使用Map

  1. 需要按照進入順序進行返回
  2. 需要獲取key的size時候
  3. key值可以是任意類型
  4. 進行迭代
  5. key 的數據量很多,以及進行頻繁操作時候,不確定key的情況下

使用Object

  1. 當所要存儲的是簡單數據類型,并且 key 都為字符串或者整數或者 Symbol 的時候,優先使用 Object ,因為Object可以使用 字符變量 的方式創建,更加高效。
  2. 當需要在單獨的邏輯中訪問屬性或者元素的時候,應該使用 Object,例如:通過訪問obj上面的方法
  3. JSON 直接支持 Object,但不支持 Map
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。