ES6之

1.通过构造函数方式创建一个set实例
console.log(new Set());//Set(0) {}  (可展开)
2.类似数组 只有值value没有键key
console.log(new Set([1, 2, 3, 4]));//Set(4) {1, 2, 3, 4} 展开发现里面只有value没有key
console.log(new Set("1234"));//Set(4) {"1", "2", "3", "4"} 仍然只有value没有key
3.参数是一个数组或者一个类似数组的(有接口的 iterable)
console.log(new Set("1234"));//Set(4) {"1", "2", "3", "4"} 仍然只有value没有key
4.有iterable接口的常用的数据结构:数组,arguments,元素集合,Set,Map,字符串,会默认去重
function fn() {
        console.log(new Set(arguments));
    }
    fn(1,2,3,4);//Set(4) {1, 2, 3, 4} 展开仍然没有key 只有value

    console.log(new Set([1, 1, 3, 4, 2, 4, 2, 3, 10]));//Set(5) {1, 3, 4, 2, 10} 有去重的功能
    console.log(new Set("12311332414214314345"));//Set(5) {"1", "2", "3", "4", "5"} 去重
5.关于Set实例的大小个数的方法:add clear delete has
1.add() 增加
  • 如果之前没有 会成功加上 如果之前有 就不会加上 因为自带去重
  • 返回值:增加后的Set实例 如此我们根据返回值可以使用链式写法
  • add参数只能一次写一个
let set1 = new Set([1,2,"哈哈",null,NaN,true]);
console.log(set1.add(1));//添加失败
console.log(set1.add(10));//添加成功
console.log(set1.add(11).add(12));//链式写法添加成功
console.log(set1.add(NaN));//添加失败  尽管NaN不等于NaN 但是也不能添加成功
2.delete() 删除
  • 参数是删除的值
  • 返回值是布尔值 true or false 如果里面有着一项就删除成功true,没有此项就删除失败false
console.log(set1.delete(12));//true
console.log(set1);//12 已经删除成功
console.log(set1.delete(1000));//false
3.has() 判断有没有此项
  • 参数是判断的项 返回值true/false
console.log(set1.has(NaN));//true 这里的内置方法一定不是靠相等判断的 因为NaN不等于NaN
4.clear 清空
  • 没有返回值 没有参数
console.log(set1.clear());//undefined 因为没有返回值
console.log(set1);//Set(0) {}  已经被清空了
5.遍历的方法:forEach keys values entries

forEach 遍历每一项 参数函数有形参 当前项 当前项的索引 正在遍历的当前实例
然而Set实例只有value没有key 所以就会造成以下情况

let set2 = new Set([1,2,"哈哈",null,NaN,true]);
set2.forEach((...rest)=>{
    console.log(rest);
});

因为Set实例只有value没有key 所以 遍历出来打印出来的内容 item 和 index都是一模一样的当前项 第三个是当前实例

[ 1, 1, Set { 1, 2, '哈哈', null, NaN, true } ]
[ 2, 2, Set { 1, 2, '哈哈', null, NaN, true } ]
[ '哈哈', '哈哈', Set { 1, 2, '哈哈', null, NaN, true } ]
[ null, null, Set { 1, 2, '哈哈', null, NaN, true } ]
[ NaN, NaN, Set { 1, 2, '哈哈', null, NaN, true } ]
[ true, true, Set { 1, 2, '哈哈', null, NaN, true } ]
6.keys 遍历一个接口
console.log(set2.keys());//SetIterator {1, 2, "哈哈", null, NaN, …}
//我们知道之前测试代码中有一个for of 方法是用来遍历接口的
for(let key  of set2.keys()){
    console.log(key);
    //打印出了 1 2 哈哈 null NaN true
    //因为Set没有key只有value
    //key仍然是value值
}
7.values 大致同上 遍历了一个接口 但是用for of打印的是正经value
    console.log(set2.values());//SetIterator {1, 2, "哈哈", null, NaN, …}
    for(let key of set2.values()){
        console.log(key);//打印出了 1 2 哈哈 null NaN true
    }
8.entries 遍历了一个接口 我们使用for of 遍历一下
    console.log(set2.entries());//SetIterator {1, 2, "哈哈", null, NaN, …}
    for(let key of set2.entries()){
        console.log(key);//打印出了 [1, 1] [2, 2] ["哈哈", "哈哈"]  [null, null] [NaN, NaN]  [true, true]
    }

9.我们可以解构赋值
for(let [key,val] of set2.entries()){
    console.log(key,val);//打印出了 1 1   2 2   哈哈 哈哈    null null      NaN NaN     true true
}

//全都是value值

set用法

1.数组去重

let ary = [1,2,1,3,2,4,3,5];
console.log(new Set(ary));//Set(5) {1, 2, 3, 4, 5} 打印出后的确去重了  但是不是数组了 我们还得把它变成数组
console.log([...new Set(ary)]);//(5) [1, 2, 3, 4, 5]

改写成方法

function unique(ary) {
    return [...new Set(ary)];//Array类上的ES6新方法 from也可以转成数组
}

2.拓展 如何取两个数组的交集 并集 差集

1.并集
let ary1 = [1,3,5,7,8,9];
let ary2 = [2,4,6,7,8,9];
function add(ary1,ary2) {
	return [...new Set([...ary1,...ary2])];
}

console.log(add(ary1, ary2));//[1, 3, 5, 7, 8, 9, 2, 4, 6]

2.交集
function same(ary1,ary2) {
	return ary1.filter(item => ary2.includes(item));
}

console.log(same(ary1, ary2));//[7, 8, 9]

3.差集 :并集减去交集
function diff(ary1,ary2) {
	return add(ary1,ary2).filter(item=>!same(ary1,ary2).includes(item));
	//filtter是遍历数组每一项做判断 判断交集的项是否包含并集的项 包含(相同) 返回true 再取反返回false
}

console.log(diff(ary1, ary2));//[1, 3, 5, 2, 4, 6]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值