Map对象是一种有对应 键/值 对的对象, Object也是 键/值 对的对象 ;都是用来存储数据的一种结构,这两个结构有什么比较的呢?
下面就引入leetcode第576题
代码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做为备忘录然后就what fuck???map本质上也是继承Object为什么使用map会比使用对象的效率好这么多?
然后翻了一下MDN对map的介绍也有对Map和Object的对比
从图中可以看出Map 在很多时候优于 Object,但是作为 JavaScript 最基础的数据类型,还是有很多情景更适合使用 Object。那再延伸一下什么时候使用Object,在什么时候使用Map更合适呢
使用Map
- 需要按照进入顺序进行返回
- 需要获取key的size时候
- key值可以是任意类型
- 进行迭代
- key 的数据量很多,以及进行频繁操作时候,不确定key的情况下
使用Object
- 当所要存储的是简单数据类型,并且 key 都为字符串或者整数或者 Symbol 的时候,优先使用 Object ,因为Object可以使用 字符变量 的方式创建,更加高效。
- 当需要在单独的逻辑中访问属性或者元素的时候,应该使用 Object,例如:通过访问obj上面的方法
- JSON 直接支持 Object,但不支持 Map