产生起因:
JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。
但是JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。为了解决这个问题,最新的ES6规范引入了新的数据类型Map和set.
Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构
Set (集合)[类数组]
应用场景
数组去重和数据存储
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i); // 2 3 5 4
}
// 去除数组的重复成员
let array = [1,2,1,4,5,3];
[...new Set(array)] // [1, 2, 4, 5, 3]
方法和属性
属性
size:返回字典所包含的元素个数
操作方法
- add(value):添加某个值,返回 Set 结构本身。
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- has(value):返回一个布尔值,表示该值是否为 Set 的成员。
- clear():清除所有成员,无返回值。
- size: 返回set数据结构的数据长度
let set1 = new Set([111,211])
//1.属性 size:返回字典所包含的元素个数
console.log(set1.size)//2
//操作方法
//1.delete(value)
console.log(set1.add(99))//Set [1,2,99]
//2.delte(value)
console.log(set1.delete(99))//true
//3.has(value)
console.log(set1.has(111))//true
//4.clear(value)
console.log(set1.clear())//无返回值
console.log(set1)//Set(0) {size: 0}
遍历方法
- keys():返回键名的遍历器
- values():返回键值的遍历器
- entries():返回键值对的遍历器
- forEach():使用回调函数遍历每个成员,无返回值
let set = new Set(['a', 'b', 'c']);
//keys():返回键名的遍历器
console.log(set.keys())//SetIterator {'a', 'b', 'c'}
console.log([...set.keys()])//['a', 'b', 'c']
//values():返回键值的遍历器
console.log(set.values()); // SetIterator {"a", "b", "c"}
console.log([...set.values()]); // ["a", "b", "c"]
//entries():返回键值对的遍历器
console.log(set.entries()); // SetIterator {"a", "b", "c"}
console.log([...set.entries()]); // [["a", "a"], ["b", "b"], ["c", "c"]]
//forEach():使用回调函数遍历每个成员,无返回值
let set5 = new Set(['a', 2, 3]);
set5.forEach((value, key) => console.log(key + ': ' + value));
// a: a
// 2: 2
// 3: 3
Set与Array的区别
-
set 无序 元素不可以重复
-
Array 有序 元素可以重复
var myArray = ["value1", "value2", "value3"];
// 用Set构造器将Array转换为Set
var mySet = new Set(myArray);
mySet.has("value1"); // returns true
// 用...(展开操作符)操作符将Set转换为Array
console.log([...mySet]); // 与myArray完全一致
Array.from()
将Set类数组转化为真实的数组 跟 ... 类似
let arrayLike = {
0: 'tom',
1: '65',
2: '男',
3: ['jane','john','Mary'],
'length': 4
}
let arr = Array.from(arrayLike)
console.log(arr) // ['tom','65','男',['jane','john','Mary']]
Map (字典)[类对象]
它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适;
那么集合又和字典有什么区别呢:
-
共同点:集合、字典可以存储不重复的值
-
不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储