1、集合介绍
代码演示一下 js如何操作
// 数组去重
const arr = [1, 2, 1, 2];
const arr1 = new Set(arr)
console.log([...arr1]) // [1,2] 需要加一个[]不加得到的是一个集合内容为 1 2
// 判断元素 是否在集合内
const set = new Set([1, 2, 3, 4]) //初始化 集合
const has = set.has(6)
console.log(has) // false
const has1 = set.has(1)
console.log(has1) // true
// 求交集
const set1 = new Set([1, 2, 3])
const set2 = new Set([1, 3])
// set3表示交集
// 需要先转化成数组 然后 使用 filter方法筛选出来 set1 set2共有的结果
const set3 = new Set([...set1].filter(item =>
set2.has(item)
))
console.log([...set3]) // [1,3]
2、leetcode 349 两个数组交集
// 注意 这里使用数组原生方法 includes更好
var intersection = function(nums1, nums2) {
// 时间复杂度 O(m * n) 空间复杂度 O(m) m 指的是 nums1去重后的长度
return [...new Set(nums1)].filter(item=> nums2.includes(item))
};
// 数组去重常规方法 很重要的
var arr = [1, 1, 2, 3, 3, 6];
function unique() {
var hash = [];
for (var i = 0; i < arr.length; i++) {
// hash.indexOf(arr[i]) == -1 注意前一部分写法
if (hash.indexOf(arr[i]) == -1) {
hash.push(arr[i]);
}
}
return hash;
}
console.log(unique(arr))
3、前端于集合 使用 es6 set
1) 展示 new 和 add 方法
// 先展示 add 方法
var set = new Set();
set.add(1);
console.log(set) //Set(1) {1}
set.add(5);
console.log(set) //Set(2) {1, 5}
set.add(5);
console.log(set) //还是 Set(2) {1, 5} set中不允许 重复
// 可添加 多种其他类型
set.add('text');
console.log(set) //Set(3) {1, 5, "text"} 添加的字符串
set.add({
a: 1,
b: 3
});
console.log(set) // Set(4) {1, 5, "text", {…}} 添加对象
// 看似 又添加了一个完全一样的对象 实则不一样 两个在内存地址中位置不一样
set.add({
a: 1,
b: 3
});
console.log(set) //Set(5) {1, 5, "text", {…}, {…}}
//展示 has方法
const has1 = set.has(1)
console.log(has1) // true
const has2 = set.has({
a: 1,
b: 3
})
console.log(has2) // false 对象需要注意 即使对象形式一样 但是在内存上地址不一样
// 下面 说明这个例子 你可以 大胆试试
var obj1 = {
a: 1,
b: 6
}
var obj2 = {
a: 1,
b: 6
}
console.log(obj1 === obj2) // false
//delete
set.delete(5)
console.log(set) // 删除了set里面的 5 并且 size减小了 1
执行delete之后 可以发现 size也变化了
2)Set几种迭代形式
- 第一种遍历方法
for ... of
// 当然 需要说明的是 这个地方需要使用之前已经定义过的set
for (let item of set) {
console.log(item)
}
结果展示一下
- 第二种遍历方式 使用keys
for (let item of set.keys()) {
console.log(item)
}
- 第三种方法 使用 values
for (let item of set.values()) {
console.log(item)
}
- 说明了啥情况 ??? 有没有 想一想
set.keys() 与set.vaules() 表达的内容一样??? 怎么验证一下这个问题 ?
当然 两个 === 关系是 不成立的 不要问我怎么知道 --
// 验证
for ([keys, values] of set.entries()) {
console.log(keys, values)
}
// 万一结果 不是这样 我的脸不是被打肿了嘛 希望不是
// nice 很开心 它是我们预期的结果,这很重要
3)set <---> Array互相转化 ???? 怎么操作 ?
- 先说 如何实现 set ---> Array
// 思想 : 展开 / Array.from / Array.of 方法
// 第一种方法
var myArr = [...set]
console.log(myArr) //(4) [1, "text", {…}, {…}]
// 第二种方法
var myArr1 = Array.from(set)
console.log(myArr1) //(4) [1, "text", {…}, {…}]
// 第三种方法
var myArr2 = Array.of(set)
console.log(myArr2) // [Set(4)] 在整个外面套了一层数组
- 再说一下 Array ---> set
// 思想: 把数组放进 new Set(...) 里面
var set2 = new Set([1, 2, 3, 4])
console.log(set2) //Set(4) {1, 2, 3, 4}
4)求 Set 交集
// 思想: 先转为数组 使用 数组方法筛选出来两个交集部分
var set1 = new Set([1, 2, 3])
var set2 = new Set([1, 2])
var myArr = [...set1].filter(x =>
set2.has(x))
console.log(myArr) // [1, 2]
5)求 Set 差集
// 思想: 第一个有但第二个没有的部分
var set1 = new Set([1, 2, 3])
var set2 = new Set([1, 2])
var myArr = ([...set1].filter(x =>
!set2.has(x)
))
console.log(myArr) // [3]