Map和Set、Map和Object的区别

Map 和 Object 的区别

特性上的区别:

Map 更适合”键值对”这种数据结构。Object 的键只能是 string、整数、Symbol 类型,Map 的键可以是任意类型。

Map 实现了迭代协议,可用 for…of 遍历,而 Object 不行, Object 是不可迭代的。

Map 可用 size 属性获取长度,而 Object 没有获取长度的属性。

Map 遍历顺序可以保证,按插入时输出。
而 Object 无法保证,Object 的遍历顺序为:

  • 当 key 类型为Number,按 key 从小到大排序
  • 当 key 类型为String,会被转为Number类型,按 key 从小到大排序
  • 当 key 类型为Symbol,按创建的时间升序排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let obj = new Object();
obj['jack'] = 1;
obj[0] = 2;
obj['4'] = 3;
obj[5] = 3;
obj['2'] = 3;
obj[1] = 3;
obj['tom'] = 4;
obj['toni'] = 2;

//填入Object的元素key是自动按照字符串排序的,数字排在前面,且升序拍戏,字符串在后
for (let k in obj) {
console.log(k); // 0 1 2 5 jack tom toni
// console.log(typeof k); // 都是string,因为都会调用对象的toString()方法, key.toString()
}

当数据量大(长度为十几万以上)的时候,Map 的读入、写入、删除会比 Object 更快,数据量小的时候差别不多,object 稍微好一点点点

Map 的使用场景:

  • 聊天内容与聊天列表
    • 数据量大、频繁的写入、更新、对写入顺序有要求
  • 策略模式
    • 用于储存多个键值对应一个规则的情况

Map 和 Set 的应用

set:

  1. 去重
1
2
3
4
5
// 写法一
Array.from(new Set([1, 2, 3, 3, 4])) // [1,2,3,4]

// 写法二
[...new Set([1, 2, 3, 3, 4])] // [1,2,3,4]
  1. 取并集、交集、差集
1
2
3
4
5
6
7
8
9
10
11
const arr1 = new Set([1, 2, 3, 4, 5]);
const arr2 = new Set([1, 5, 6]);

//并集
new Set([...arr1, ...arr2]);

// 交集
new Set([...arr1].filter((item) => arr2.has(item)));

// 差集
new Set([...arr1].filter((item) => !arr2.has(item)));

map:
可以使用任意的数据类型作为键,比对象更合适

Array.from

可以将类数组和可遍历(iterator)对象转换为真正的数组。

1
Array.from(new Set([1, 2])); // [1, 2]

Map 和 Set 的区别

不同点

Set 结构类似于数组,成员唯一,没有排序的概念。Map 结构它保存的是键值对的集合。

添加成员的方法不同:
Set 使用 add 方法 ,如:set.add(6),Map 使用 set 方法,如 map.set(‘key’, ‘value’)

获取成员的方法不同:
Set 结构没有排序的概念,无法获取单个成员。Map 结构使用 map.get(‘key’) 获取成员的值。

相同点

Map 和 Set 都是 es 的新增的数据结构。

拥有同样的遍历方法:
keys()、values()、entries()、forEach()

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×