一、set
set相当于一种类似于数组的数据结构,不过set中成员的值是唯一的,有很多内置的方法。set中的方法,常用的有set.size,用于获取set的长度;add()用于添加一个成员;delete()用于删除set中的一个值;clear()用于清空set内的所有值;has()可以用于判断一个值是否该set中的成员,返回true/false.filter()过滤方法。
创建一个新的set:
方式一:
const set = new Set();
set.add(2).add('2').add(4);
方式二:
var arr = [1,2,3,4,2,4,5,2,1,4,5,5,7];
const set2 = new Set(arr);
方式三:
const set3 = new Set();
[2,34,2,4,5,2,4].forEach(item => set3.add(item));
set中的方法,常用的有set.size,用于获取set的长度;add()用于添加一个成员;delete()用于删除set中的一个值;clear()用于清空set内的所有值;has()可以用于判断一个值是否该set中的成员,返回true/false.
利用set来进行对数组的去重操作:
方法一:
var arr = [1,2,3,4,2,4,5,2,1,4,5,5,7];
console.log([...new Set(arr)]);
方法二:
var arr2 = new Set([1,2,3,4,2,4,5,2,1,4,5,5,7]);
var arr3 = Array.from(arr2);
遍历一个set可以用for...of... 也可以用for..in...
对于for k in K 循环,对象中获取的是key,数组中获取的是索引
var arr = [1,2,3,4,5];
for(var v in arr){
console.log(v) //01234索引 console.log(arr[v]) 1,2,3,4,5
};
而for v of V,获取的则是当前的值value
var arr2 = new Set([1,2,3,4,2,4,5,2,1,4,5,5,7]);
for(let v of arr2){
console.log(v);
};
在遍历方法中,keys()获取的是键,value()获取的是值,entries()获取的是键值对。
filter() 过滤方法,利用filter()可以实现获取两个set集合的并集,交集,差集。。
//获取交集
var arr1 = new Set([1,2,3,4,2,4,5,2,1,4,5,5,7]);
var arr2 = new Set([9,5,2,4,8]);
var arr3 = new Set([...arr1].filter(item => arr2.has(item))); // 2 4 5
//并集
var arr4 = new Set([...arr1,...arr2]);
//差集
var arr1 = new Set([1,2,3,4,2,4,5,2,1,4,5,5,7]);
var arr2 = new Set([9,5,2,4,8]);
var arr3 = new Set([...arr1].filter(item => !arr2.has(item))); //1 3 7
var arr3 = new Set([...arr2].filter(item => !arr1.has(item))); //9 8
二、map
map这种数据结构类似于对象,但不是对象,采用键值对的方式,但是键可以是任意类型而不局限于字符串。
var m = new Map([['name','a'],['age',10],['a',3]]);
//keys() value() entries()
for(let [k,v] of m){
console.log(v)
};
for(let k of m.keys()){
console.log(k)
};
for(let v of m.values()){
console.log(v)
};
同样的,map可以使用扩展运算符:
var m2 = [...m.keys()];此时,m2将是由m中所有键组成的数组。也可以直接[...m]将m转化为一个数组。
那么,map和对象之间怎么互相转化呢?
var m = new Map([['name','a'],['age',10],['a',3]]);
var obj = {};
for(let [k,v] of m){
obj[k] = v;
};
console.log(obj);
//对象转为map
var obj2 = {msg:'hello',flag:true};
var m = new Map();
for(let k in obj2){
m.set(k,obj2[k])
};
需要注意的是for...of...是不能遍历对象的,如果想用for...of方法遍历则需要先利用Object.keys()将数组中的键组成一个数组,在进行for...of遍历:
function objToStrMap(obj) {
let m = new Map();
for (let k of Object.keys(obj)) { //name value for...of 不能遍历对象
m.set(k, obj[k]);
}
return m;
};
objToStrMap({name:1, value:2});