广告位联系
返回顶部
分享到

JavaScript中的Map数据结构介绍

JavaScript 来源:互联网 作者:秩名 发布时间:2022-01-25 09:00:00 人浏览
摘要

1.什么是 Map Map 就是映射的意思,即从键到值的映射。 Map 保存键值对,并且 能够记住键的原始插入顺序 。 那么它和 Object 有什么区别 ? 对象一般用字符串作键 1 2 3 const obj = { val : o

1. 什么是 Map

Map 就是映射的意思,即从键到值的映射。

Map 保存键值对,并且能够记住键的原始插入顺序

那么它和 Object 有什么区别 ?

对象一般用字符串作键

1

2

3

const obj = {

    val : "object"

}

任何值(对象或者原始值) 都可以作为 Map 的一个键或一个值

1

2

3

4

5

6

const m = new Map();;

m.set('val', 'map');

m.set(1, 'number');

m.set(new Set([1, 2]), 'set');

m.set({}, 'object');

console.log(m);

在这里插入图片描述

所以,在键值对的数据结构中,Map 比 Object 更为合适

2. Map 构造函数

对于 Set 的构造函数的参数,可以传递以下几种形式。

2.1) 数组

注意,要传递的是二维数组,因为二维数组才能体现出键值对

1

2

3

4

5

const m = new Map([

    ['val', 'map'],

    ['apple', 'fruit']

]);

console.log(m);

在这里插入图片描述

2.2) Set

以 Set 作为参数,也要体现出键值对形式

对 Set 不了解的,想了解的可以看看下面这篇文章:JavaScript—Set

1

2

3

4

5

const m = new Map(new Set([

    ['tigger', 'animal'],

    ['orange', 'fruit']

]));

console.log(m);

在这里插入图片描述

2.3) Map

1

2

3

4

5

6

const m1 = new Map([

    ['watermelon', 'fruit'],

    ['cat', 'animal']

])

const m2 = new Map(m1);

console.log(m2);

在这里插入图片描述

这里相当于把m1复制过去,给了m2,不过它们不是同一个 Map

1

console.log(m2 === m1);

在这里插入图片描述

综上,Map 构造函数的参数要能体现出键值对的形式。

3. Map 的实例属性和方法

3.1) Map 的属性

size

Map 的属性,有一个属性size,用来存储它的成员个数

1

2

3

4

5

6

const m = new Map([

    ['val', 'map'],

    ['cat', 'animal'],

    ['orange', 'fruit']

]);

console.log(m.size);

在这里插入图片描述

3.2) Map 的方法

set

给 Map 中添加成员

1

2

3

4

5

6

7

8

9

10

11

const m = new Map();

// 它的参数为两个,第一个为键,第二个为值

m.set('val', 'map');

console.log(m);

// 可以连缀 Set

m.set('orange', 'fruit').set('cat', 'animal');

console.log(m);

// 添加的新成员如果键已经存在了,那么将会覆盖它

// 键的顺序不会发生改变,因为 Map 能够记住键的原始插入顺序

m.set('orange', 'sweet');

console.log(m);

在这里插入图片描述

get

通过键获取 Map 的成员

1

2

3

4

5

6

7

8

9

10

const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

console.log(m.get('val'));

console.log(m.get(true));

// 获取不存在的键时,会返回 undefined

console.log(m.get('tigger'));

在这里插入图片描述

has

用来判断 Map 是否含有某个键

1

2

3

4

5

6

7

8

const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

console.log(m.has(true));

console.log(m.has('true'));

在这里插入图片描述

delete

通过键,来删除 Map 中的成员

1

2

3

4

5

6

7

8

9

10

const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

m.delete('cat');

// 删除不存在的成员,将什么也不会发生,也不会报错

m.delete('true');

console.log(m);

在这里插入图片描述

clear

删除 Map 的所有成员

1

2

3

4

5

6

7

8

const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

m.clear();

console.log(m);

在这里插入图片描述

forEach

用来遍历 Map 的成员

它有两个参数,第一个参数为回调函数,第二个参数设定回调函数中this指向什么,即

1

m.forEach(回调函数, 回调函数的指向)

先来看第一个参数

1

2

3

4

5

m.forEach(function(value, key, map){

    value 就是 Map 的值

    key 就是 Map 的键

    map 就是前面Map的本身,即这里 map === m

});

通过一个例子理解一下:

1

2

3

4

5

6

7

8

9

10

const m = new Map([    ['val', 'map'],    ['orange', 'fruit'],    ['cat', 'animal'],    [true, 'false']]);m.forEach(function(value, key, map) {    console.log(value, key, map == m);});const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

 

m.forEach(function(value, key, map) {

    console.log(value, key, map == m);

});

在这里插入图片描述

再来看第二个参数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

 

m.forEach(function(value, key, map) {

    console.log(this);

}, document);

const m = new Map([

    ['val', 'map'],

    ['orange', 'fruit'],

    ['cat', 'animal'],

    [true, 'false']

]);

 

m.forEach(function(value, key, map) {

    console.log(this);

}, document);

在这里插入图片描述

4. Map的注意事项

Map 对键名是否相同的判断基本遵循严格相等===的判断

不过对于NaN,在 Set 中,NaN 等于 NaN

5. Map的使用场景

  • 只需要键值对的结构时,即 key => value 的结构
  • 需要字符串以外的键或者值

举个例子来看看 Map 的应用:

DOM元素进行操作

先写一个 HTML 代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Map</title>

</head>

<body>

    <p>one</p>

    <p>two</p>

    <p>three</p>

</body>

</html>

此时效果是这样的:

在这里插入图片描述

然后对p元素进行修改:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<script>

    // 利用数组解构赋值将 p 元素获取的同时解构出来

    const [p1, p2, p3] = document.querySelectorAll('p');

    const m = new Map([

        [p1, new Map([

            ['color', 'blue'],

            ['fontSize', '40px']

        ])],

        [p2,  new Map([

            ['color', 'orange'],

            ['fontSize', '40px']

        ])],

        [p3,  new Map([

            ['color', 'green'],

            ['fontSize', '40px']

        ])]

    ]);

 

    m.forEach((propMap, elem) => {

        propMap.forEach((value, prop) => {

            elem.style[prop] = value;

        });

    });

</script>

在这里插入图片描述


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计