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
- 需要按照進入順序進行返回
- 需要獲取key的size時候
- key值可以是任意類型
- 進行迭代
- key 的數據量很多,以及進行頻繁操作時候,不確定key的情況下
使用Object
- 當所要存儲的是簡單數據類型,并且 key 都為字符串或者整數或者 Symbol 的時候,優先使用 Object ,因為Object可以使用 字符變量 的方式創建,更加高效。
- 當需要在單獨的邏輯中訪問屬性或者元素的時候,應該使用 Object,例如:通過訪問obj上面的方法
- JSON 直接支持 Object,但不支持 Map