ES6的Map常用用法

雨点打透心脏的1/2处 2023-06-20 06:52 59阅读 0赞

Map 与数组的关系

  1. var kvArray = [["key1", "value1"], ["key2", "value2"]];
  2. // 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
  3. var myMap = new Map(kvArray);
  4. myMap.get("key1"); // 返回值为 "value1"
  5. // 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
  6. console.log(Array.from(myMap)); // 输出和kvArray相同的数组
  7. // 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
  8. console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

Map 转为数组

  1. const myMap = new Map()
  2. .set(true, 7)
  3. .set({foo: 3}, ['abc']);
  4. [...myMap]
  5. // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]

Map 转为对象

如果所有 Map 的键都是字符串,它可以无损地转为对象。如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。

  1. function strMapToObj(strMap) {
  2. let obj = Object.create(null);
  3. for (let [k,v] of strMap) {
  4. obj[k] = v;
  5. }
  6. return obj;
  7. }
  8. const myMap = new Map()
  9. .set('yes', true)
  10. .set('no', false);
  11. strMapToObj(myMap)
  12. // { yes: true, no: false }

复制或合并 Maps

  1. var original = new Map([
  2. [1, 'one']
  3. ]);
  4. var clone = new Map(original);
  5. console.log(clone.get(1)); // one
  6. console.log(original === clone); // false. Useful for shallow comparison

对象转为 Map

  1. function objToStrMap(obj) {
  2. let strMap = new Map();
  3. for (let k of Object.keys(obj)) {
  4. strMap.set(k, obj[k]);
  5. }
  6. return strMap;
  7. }
  8. objToStrMap({yes: true, no: false})
  9. // Map {"yes" => true, "no" => false}

Map 转为 JSON

Map 转为 JSON 要区分两种情况。一种情况是,Map 的键名都是字符串,这时可以选择转为对象 JSON。

  1. function strMapToJson(strMap) {
  2. return JSON.stringify(strMapToObj(strMap));
  3. }
  4. let myMap = new Map().set('yes', true).set('no', false);
  5. strMapToJson(myMap)
  6. // '{"yes":true,"no":false}'

另一种情况是,Map 的键名有非字符串,这时可以选择转为数组 JSON。

  1. function mapToArrayJson(map) {
  2. return JSON.stringify([...map]);
  3. }
  4. let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
  5. mapToArrayJson(myMap)
  6. // '[[true,7],[{"foo":3},["abc"]]]'

JSON 转为 Map

JSON 转为 Map,正常情况下,所有键名都是字符串。

  1. function jsonToStrMap(jsonStr) {
  2. return objToStrMap(JSON.parse(jsonStr));
  3. }
  4. jsonToStrMap('{"yes": true, "no": false}')
  5. // Map {'yes' => true, 'no' => false}

但是,有一种特殊情况,整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组。这时,它可以一一对应地转为 Map。这往往是 Map 转为数组 JSON 的逆操作。

  1. function jsonToMap(jsonStr) {
  2. return new Map(JSON.parse(jsonStr));
  3. }
  4. jsonToMap('[[true,7],[{"foo":3},["abc"]]]')
  5. // Map {true => 7, Object {foo: 3} => ['abc']}

Map对象间可以进行合并,但是会保持键的唯一性。

  1. var first = new Map([
  2. [1, 'one'],
  3. [2, 'two'],
  4. [3, 'three'],
  5. ]);
  6. var second = new Map([
  7. [1, 'uno'],
  8. [2, 'dos']
  9. ]);
  10. // 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
  11. // 展开运算符本质上是将Map对象转换成数组。
  12. var merged = new Map([...first, ...second]);
  13. console.log(merged.get(1)); // uno
  14. console.log(merged.get(2)); // dos
  15. console.log(merged.get(3)); // three

Map对象也能与数组合并

  1. var first = new Map([
  2. [1, 'one'],
  3. [2, 'two'],
  4. [3, 'three'],
  5. ]);
  6. var second = new Map([
  7. [1, 'uno'],
  8. [2, 'dos']
  9. ]);
  10. // Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
  11. var merged = new Map([...first, ...second, [1, 'eins']]);
  12. console.log(merged.get(1)); // eins
  13. console.log(merged.get(2)); // dos
  14. console.log(merged.get(3)); // three

发表评论

表情:
评论列表 (有 0 条评论,59人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6语法

    后天就要交大论文绪论的,现在居然还在这写博客,YNB!   聊正事!什么是ES,ES就是ECMA Script,Javascript的语言标准,我们今天具体说下 一.

    相关 ES6语法

    [转载文章地址][Link 1] var 之前,js定义变量只有一个关键字:var var有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。 例如这样