js的面试与笔试---数据结构Set的用法

特性

似于数组,但它的一大特性就是所有元素都是唯一的,没有重复。

我们可以利用这一唯一特性进行数组的去重工作。

单一数组的去重。

let set6 = new Set([1, 2, 2, 3, 4, 3, 5])
console.log('distinct 1:', set6)

结果:

distinct 1: Set { 1, 2, 3, 4, 5 }

 

多数组的合并去重

let arr1 = [1, 2, 3, 4]
let arr2 = [2, 3, 4, 5, 6]
let set7 = new Set([...arr1, ...arr2])
console.log('distinct 2:', set7)

结果:

distinct 2: Set { 1, 2, 3, 4, 5, 6 }

 

操作

1.向Set中添加元素。

let set1 = new Set()
set1.add(1)
set1.add(2)
set1.add(3)
console.log('added:', set1)

结果:

added: Set { 1, 2, 3 }

 

2.从Set中删除元素。

let set1 = new Set()
set1.add(1)
set1.add(2)
set1.add(3)
set1.delete(1)
console.log('deleted:', set1)

结果:

deleted: Set { 2, 3 }

 

3.判断某元素是否存在。

复制代码

let set1 = new Set()
set1.add(1)
set1.add(2)
set1.add(3)
set1.delete(1)
console.log('has(1):', set1.has(1))
console.log('has(2):', set1.has(2))

复制代码

结果:

has(1): false
has(2): true

 

4.清除所有元素。

let set1 = new Set()
set1.add(1)
set1.add(2)
set1.add(3)
set1.clear()
console.log('cleared:', set1)

结果:

cleared: Set {}

 

Set和Array互转

1.数组转Set

let set2 = new Set([4,5,6])
console.log('array to set 1:', set2)

let set3 = new Set(new Array(7, 8, 9))
console.log('array to set 2:', set3)

结果:

array to set 2: Set { 4, 5, 6 }
array to set 3: Set { 7, 8, 9 }

 

2.Set转数组

let set4 = new Set([4, 5, 6])
console.log('set to array 1:', [...set4])
console.log('set to array 2:', Array.from(set4))

结果:

set to array 1: [ 4, 5, 6 ]
set to array 2: [ 4, 5, 6 ]

 

遍历

可以使用Set实例对象的keys(),values(),entries()方法进行遍历。

由于Set的键名和键值是同一个值,它的每一个元素的key和value是相同的,所有keys()和values()的返回值是相同的,entries()返回的元素中的key和value是相同的。

复制代码

let set5 = new Set([4, 5, 'hello'])
console.log('iterate useing Set.keys()')
for(let item of set5.keys()) {
  console.log(item)
}

console.log('iterate useing Set.values()')
for(let item of set5.values()) {
  console.log(item)
}

console.log('iterate useing Set.entries()')
for(let item of set5.entries()) {
  console.log(item)
}

复制代码

结果:

复制代码

iterate useing Set.keys()
4
5
hello

iterate useing Set.values()
4
5
hello

iterate useing Set.entries()
[ 4, 4 ]
[ 5, 5 ]
[ 'hello', 'hello' ]

复制代码

交,并,补操作

let a = new Set([1, 2, 3]);
let b = new Set([3, 5, 2]);

// 并集
let unionSet = new Set([...a, ...b]);
console.log("并集",unionSet)//[1,2,3,5]

// 交集
let intersectionSet = new Set([...a].filter(x => b.has(x)));
console.log("交集",intersectionSet)// [2,3]

// ab差集
let differenceABSet = new Set([...a].filter(x => !b.has(x)));
console.log("差集",differenceABSet)// [1]

子集

根据上面子集的定义,那么如何判断a是不是b的子集呢? 
A:假如a和b的并集没有产生新的元素,即unionSet.size == a.size || unionSet.size == b.size,那么说明a是b的子集。 
B:遍历所有的a集合,判断b集合里面是否有a的所有成员,如果有那么说明a是b的子集。

//A 假设判断a是不是b的子集
if(unionSet.size == b.size)
    console.log('a是b的子集')     
}

//B
let flag = false;
for(let item of b.values()){
    if(a.has(item)){
       flag = true;
    }
}
if (flag) {
   console.log('a是b的子集')
}
else {
   console.log('a不是b的子集')
}

笔者认为这里采用方法A效率更高,当集合元素变得很多的时候,采用遍历的方法效率就会降低。如果有其他更好的方法,欢迎提出。

 

 

 

其他特性

在向Set加入值时,Set不会转换数据类型,内部在判断元素是否存在时用的类似于精确等于(===)的方法,“2”和2是不同的,NaN等于其自身。

let set8 = new Set()
set8.add(NaN)
set8.add(NaN)
console.log('NaN===Nan is true:', set8)

结果:

NaN===Nan is true: Set { NaN }

 

End

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值