【数据结构】ES6中的Set(集合)

1. Set概述

Set数据结构是ES6中引入的,MDN中的定义如下:

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

Set是一个集合,他的元素不会重复,每个元素都是唯一且无序的。

注意:Set中两对象是不相等的,Set中没有键只有值,Set中NAN是相等的。

2. 基本使用

  • 创建一个Set:
let mySetset = new Set()
  • 返回 Set 对象中的值的个数:
mySet.size; // 4, 刚刚移除一个值
  • 在Set对象尾部添加一个元素。返回该Set对象:
mySet.add(1); // Set [ 1 ]
mySet.add(5); // Set [ 1, 5 ]
  • 移除Set对象内的所有元素:
mySet.clear()
  • 移除Set的中与这个值相等的元素,即如果该元素存在,返回true,否则返回false
mySet.delete(5);  // true,  从set中移除5
  • 返回一个布尔值,表示该值在Set中存在与否:
mySet.has(5);     // false, 5已经被移除
  • 按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了thisArg参数,回调中的this会是这个参数。
mySet.forEach(function(value) {
  console.log(value);
});
  • 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法和Map对象保持相似, 每个值的键和值相等。
for (let [key, value] of mySet.entries()) console.log(key);
  • 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
for (let item of mySet.values()) console.log(item);
  • 与values()方法相同,返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
for (let item of mySet.keys()) console.log(item);

3. 其他方法

我们可以通过以下方法求集合的交集和差集:

// 可以通过如下代码模拟求交集 
let intersection = new Set([...set1].filter(x => set2.has(x)));

// 可以通过如下代码模拟求差集
let difference = new Set([...set1].filter(x => !set2.has(x)));

可以根据集合的特性来对数组进行去重操作

let arr = [1,2,3,2,1]
console.log(new Set(arr))  // {1, 2, 3}

可以结合以上两点,用Set求两个数组不重复的交集:

let intersection = [...new Set(nums1)].filter(n => nums2.includes(n) ) 

用以下方法可以进行数组与集合的互转:

// Set集合转化为数组
const arr = [...mySet]
const arr = Array.from(mySet)
// 数组转化为Set集合
const mySet = new Set(arr)

4. 面试题:用set实现两数组的交集,并集,补集

let arr1 = [1, 2, 3]
let arr2 = [3, 4, 5]

let a = new Set(arr1)
let b = new Set(arr2)

// 并集
let union = new Set([...a, ...b]);  // Set {1, 2, 3, 4, 5}
let res1 = [...union]  // 将set集合转化为数组

// 交集
let intersect = new Set(arr1.filter(x => b.has(x)));  // set {3}
let res2 = [...intersect]  // 将set集合转化为数组


// 差集
let difference = new Set(arr1.filter(x => !b.has(x))); // Set {1, 2, 4, 5}
let res3 = [...difference]  // 将set集合转化为数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CUG-GZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值