Map、Set(ES6)
Map对象
1.Map对象保存键值对,任何值(对象或者原始值)都可以作为一个键或一个值。
map与array的转换
var arr = [[1,2],[3,4]];
var myMap = new Map(arr);
console.log(myMap); //此时二维数组会被转换成一个map对象
var arr1 = Array.from(myMap); //此时map对象会转换为二维数组 [[1,2],[3,4]]
myMap的结果为:
如图可以看出,map对象与object对象的区别,多了一个size属性,说明Map对象键值对个数可以通size属性获取,而object对象则要手动计算
Map克隆
var myMap = new Map([[1,'one'],[2,'two']]);
var myMap1 = new Map(myMap);
console.log(myMap === myMap1); //false 说明Map对象构造生成实例,迭代出新的对象
Map合并
var arr1 = [[1,'one'],[2,'two'],[3,'three'],[4,'four']];
var arr2 = [[1,'aaa'],[2,'bbb']];
var arr = new Map([...arr1, ...arr2]); //发现重复键值对应的值会被替换覆盖
打印结果为:
Set对象
set对象允许存储任何类型的唯一值,无论是原始值或是对象引用
let mySet = new Set();
mySet.add(1); // Set(1) {1}
mySet.add(2); // Set(2) {1,2}
mySet.add(2); // Set(2) {1,2} 体现Set对像的唯一性
var obj = {a:1, b:2};
mySet.add(obj); // Set(3) {1,2,{...}}
mySet.add({a:1, b:2}); // Set(3) {1,2,{...},{...}} //说明对象间的引用不同不恒等,即便值相同,Set也能存储
类型转换
var mySet = new Set(['aa','bb','cc']); //Array转Set
mySet.toString(); // Set(3) 说明Set对象是不能通过toString来转成字符串的
var myArray = [...mySet]; //Set转Array
var mySet = new Set('hello'); // Set(4) {'h','e','l','o'}
数组去重
var mySet = new Set([1,2,3,4,4]);
var myArr = [...mySet];
并集
var arr1 = new Set([1,2,4,5]);
var arr2 = new Set([2,3,4,5]);
var arr = new Set([...arr1, ...arr2]); //{1,2,3,4,5}
交集
var arr1 = new Set([1,2,3,4,5]);
var arr2 = new Set([2,4,5]);
var union = new Set([...arr1].filter(x => arr2.has(x))); // {2,4,5}
差集
var arr1 = new Set([1,2,4]);
var arr2 = new Set([2,3,5]);
var differ = new Set([...arr1].filter(x => !arr2.has(x))); //{1,4}