ES6 - 你知道Map和Set和Array哪个执行查找的效率最高吗?

63748e72dc314943857316f3b1f6a386.gif#pic_center

目录

1 说一说Set 

1.1 什么是Set?

1.2 定义一个Set

1.3 Array和Set互转

2 说一说Map 

2.1 Map和JSON对象类似?

2.2 Map的key值可以是对象

3 对比一下执行查找元素的效率


1 说一说Set 

1.1 什么是Set?

Set是ES6中的一个类数组,意思就是他类似数组。而且内部元素都是唯一的,所以我们常常用他来做数组去重。

1.2 定义一个Set

首先定义一个Set,估计将值设置为重复

<script>
    let mySet = new Set([1, 2, 3, 1, 3, "我们", "nimen", "我们"]);
    console.log('定义的mySet长什么样?', mySet);
</script>

打印效果如下:

54df9cb15d87472babf44eafe190b11f.png

由此可见,重复内容被去掉了。那么如果我们定义元素是一个对象呢?来看一下

<script>
            let mySet = new Set([1, 2, 3, 1, 3, "我们", "nimen", "我们", 
                {"name": "jim"}, 
                {"name": "jim"}
            ]);
            console.log('定义的mySet长什么样?', mySet);
</script>

 效果如下:

2bf0f2f0e5db476c963b3b6067e0d69b.png

由此可见,重复的对象,我们虽然眼睛看上去是重复的,但在JS程序看来,对象的引用值却是不同的,也就是不同的元素,所以并没有去重。

1.3 Array和Set互转

这个很重要,一定要熟练掌握,为什么呢?因为面试的时候很多人我发现不熟练啊。互转代码如下:

<script>
            let mySet = new Set([1, 2, "我们", null, 3, 5]); // 这是一个Set
            let myArray = new Array(1, 2, 3, "我们", null, "我们"); // 这是一个Array
            console.log('Set::', mySet);
            console.log('Array::', myArray);
            let mySetToArray = [...mySet]; // Set转为数组
            let mySetToArray2 = Array.from(mySet);
            console.log('Set到Array的转换1', mySetToArray);
            console.log('Set到Array的转换2', mySetToArray2);
            let myArrayToSet = new Set(myArray);
            console.log('Array到Set的转换', myArrayToSet);
</script>

5aca2ee047614ccf8cdf1a0f2a8a7167.png

2 说一说Map 

2.1 Map和JSON对象类似?

其实也可以说类似吧,甚至没有Map的时候,很多时候大家常常这样说,我给你传了一个JSON,我给你传了一个对象,我给你传了一个Map,其实是比较混淆的,但大家都知道,你给我传了一个大括号,然后套了一些键值对。那么他们长的区别大吗?

<script>
            let myMap = new Map();
            myMap.set("name", "jim");
            myMap.set("age", 25);
            myMap.set("name", "tom");
            console.log('看一下我的May:::', myMap);
            let myObject = {"name": "jim", "age": 25};
            console.log('看一下我的Object:::', myObject);
</script>

0338c37531494f55a584bbf0836dec52.png

由此可见,Map中对同一个key值重复赋值,内容也会被覆盖掉。 

2.2 Map的key值可以是对象

我们一般常常喜欢定义对象的时候,key值是一个字符串,这样开发的时候可以少出问题,所以就是为什么有些人做着做着发现bug多了,弄不过来了。有时候又发现,明明代码是好使的,我没有动他,为啥又坏啦,就是因为其实代码我们没有使用的地方还有很多,我们只是在用常用的知识点,这同时也是面试的问题,面试官就爱问一些不常用的东西,然后考你平时接触的多不多。

比如我们试一下Map和JSON对象的key值是否可以定义一些乱七八糟的东西。

<script>
            let myMap = new Map();
            let myObj = {"name": "jim"};
            let myArray = [1, 2];
            let myNull = null;
            let myFn = function() {
                return "age"
            }
            myMap.set(myObj, "我的key值是对象");
            myMap.set(myArray, "我的key值是数组");
            myMap.set(myNull, "我的key值null");
            myMap.set(myFn, "我的key值函数");
            console.log('乱七八糟的Map::', myMap);
</script>

cbf3656f87ad4d1f82c3246643ed745e.png

由此可见,功能强大了,也越来越乱套了。 而之前的JSON对象,你可以试一下,其实key值倒是也能设置很多乱七八糟的东西,但明显不如Map这么强大而乱糟糟。

3 对比一下执行查找元素的效率

比如我们分别定义一个1000个元素的数组、Set和Map,然后分别从中查找一个元素

<script>
            let arr = [];
            let mySet = new Set();
            let myMap = new Map();
            for (let i=0;i<1000;i++) {
                arr.push(i);
                mySet.add(i);
                myMap.set(i);
            }

            console.time();
            console.log('-----------数组查找----------');
            let hasElement1 = false;
            for (let x=0;x<1000;x++) {
                if (arr.includes(500)) {
                    hasElement1 = true;
                    break;
                }
            }
            console.timeEnd();
            console.time();
            console.log('-----------Set查找----------');
            let hasElement2 = false;
            for (let y=0;y<1000;y++) {
                if (mySet.has(500)) {
                    hasElement2 = true;
                    break;
                }
            }
            console.timeEnd();
            console.time();
            console.log('-----------Map查找----------');
            let hasElement3 = false;
            for (let z=0;z<1000;z++) {
                if (myMap.has(500)) {
                    hasElement3 = true;
                    break;
                }
            }
            console.timeEnd();
</script>

494071877dc44c8faec502e76bc9d631.png

貌似这两个 has 方法更快一些 

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经海路大白狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值