wolichuang / dailyInterview

面试、工作中遇到的issue
0 stars 0 forks source link

js - 数组 #49

Open wolichuang opened 3 years ago

wolichuang commented 3 years ago

Map

1. 当需要使用除 String 和 Symbol 以外的键名时,那么Map是最佳解决方案。
2. 如果需要按插入顺序遍历键值对,用Map。
3. 频繁增删改查,用Map。
4. Map由于不被JSON支持,所以不适合前后端数据交互,即便是前端加工后端数据,也不值得专门把对象转为Map

5. Map的原生属性
size,获取长度

6. Map的操作方法
.set(key, value):返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。由于返回整个Map,所以可以链式操作。

.get(key):获取不到则返回undefined。

.has(key):键是否在Map中,返回布尔值。

.delete(key):删除成功返回true,失败返回false。

.clear():Map会成为空Map,方法执行返回undefined。

7. Map的遍历方法

.keys():返回键名的遍历器(即MapIterator)。不支持.forEach,支持...。

.values():返回键值的遍历器(即MapIterator)。不支持.forEach,支持...。

.entries():返回所有成员的遍历器(即MapIterator)。通常没用,遍历Map本身可以使用.forEach,遍历它的遍历器反而不能用.forEach,也就是说这个遍历器更弱。

.forEach():遍历 Map 的所有成员。跟数组完全一致的用法。

8. Map转对象
只能是遍历Map,然后依次给对象附加属性。

const map = new Map();
map.set(1,"foo").set(2,"bar").set(3,"baz");
const mapToObj = (map) => {
     let obj = {};
     for(let [k,v] of map) {
         obj[k] = v;
     }
     return obj;
}
console.log(mapToObj(map));

9. Map转数组
最优雅办法是解构,这种方法会得到二维数组,每个元素格式类似[1, 'foo']。如果只想得到键或者值组成的数组,需要改成...map.map(v=>v[0])或者...map.map(v=>v[1])。

const map = new Map();
map.set(1,"foo").set(2,"bar").set(3,"baz");
const arr = [...map];
console.log(arr);

10. 对象转Map
优雅办法是使用Object.entries()将对象解构,得到的结果也是二维数组,跟...将可遍历对象解构的结果是一样的。恰好new Map()接受二维数组转换为Map。

let obj = {"a":1, "b":2};
let map = new Map(Object.entries(obj));

11. 数组转Map
符合格式的二维数组可以直接转换为Map,如果是一维数组转Map呢?首先这不一定有必要,因为可能一维数组转Set更好一些,如果一定要转Map,可以这样:

const arr = ["foo","bar","baz"];
const arrToMap = (arr) => new Map(arr.map( (value,key) => [key,value]));
console.log(arrToMap(arr));