/*
结合数组的 map 方法、filter方法,可以实现 Map 的遍历和过滤 (Map 本身没有 map 和 filter 方法)
*/
const m1 = new Map().set(1, 'a').set(2, 'b').set(3, 'c')
console.log(m1) // Map(3) {1 => "a", 2 => "b", 3 => "c"}
const m2 = new Map(
[...m1].filter(([k, v]) => k < 3)
)
console.log(m2) // Map(2) {1 => "a", 2 => "b"}
const m3 = new Map(
[...m1].map(([k, v]) => [k * 2, '_' + v])
)
console.log(m3) // Map(3) {2 => "_a", 4 => "_b", 6 => "_c"}
// 此外,Map 还有一个 forEach 方法,与数组的 forEach 方法类似,也可以实现遍历 ---> 难理解 p222
/*
11.3.4 与其他数据结构的互相转换
+ Map 转为数组
+ 数组转为 Map
+ Map 转为对象
+ 对象转为 Map
+ Map 转为 JSON
+ JSON 转为 Map
*/
// Map 转为数组
// 前面已提过,Map 转为数组最简便的方法就是使用扩展运算符(...)
const myMap1 = new Map()
.set(true, 7)
.set({foo: 3}, ['abc'])
console.log(myMap1)
console.log(...myMap1)
console.log([...myMap1]) // (2) [Array(2), Array(2)] // [ [true, 7], [ { foo: 3 }, [ "abc" ] ] ]
// 数组转为 Map
// 将数组传入 Map 构造函数就可以转为 Map
const m4 = new Map([
[true, 7],
[{foo: 3}, ['abc']]
])
console.log(m4) // Map(2) {true => 7, {…} => Array(1)}
// Map 转为对象
// 如果 Map 的所有键都是字符串,则可以转为对象
function strMapToObj (strMap) {
let obj = Object.create(null)
for (let [k, v] of strMap) {
obj[k] = v
}
return obj
}
const myMap2 = new Map()
.set('yes', true)
.set('no', false)
strMapToObj (myMap2)
// 对象转为 Map
function objToStrMap (obj) {
let strMap = new Map()
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k])
}
return strMap
}
objToStrMap({yes: true, no: false})
// Map 转为 JSON
// Map 转为 JSON 要区分两种情况.一种情况是,Map 的键名都是字符串,这时可以选择转为对象 JSON
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap))
}
let myMap3 = new Map().set('yes', true).set('no', false)
strMapToJson(myMap3)
// 另一种情况是,Map 的键名有非字符串,这时可以选择转为数组 JSON
function mapToArrayJson(map) {
return JSON.stringify([...map])
}
let myMap4 = new Map().set(true, 7).set({foo: 3}, ['abc'])
mapToArrayJson(myMap4)
// JSON 转为 Map
// JSON 转为 Map,正常情况下所有键名都是字符串
function jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr))
}
jsonToStrMap('{"yes": true, "no": false}')
// 但是有一种特殊情况:整个 JSON 就是一个数组,且每个数组成员本身又是一个具有两个成员的数组.这时,它可以一一对应地转化为 Map ,这往往是数组转为 JSON 的逆操作.
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr))
}
jsonToMap('[[true, 7], [{"foo": 3}, ["abc"]]]')
11.4、有关Map的遍历应用
最新推荐文章于 2024-07-15 22:13:36 发布