set类型可以实现数组去重等

简介: 【10月更文挑战第30天】`Set`类型在JavaScript中提供了一种方便、高效的集合数据结构,在数组去重、集合运算、数据存在性检查等方面都有广泛的应用,能够帮助开发者更简洁、高效地处理数据。

在JavaScript中,Set类型是一种新的集合数据结构,它可以用于实现数组去重等多种功能:

数组去重

  • 基本原理Set对象中的元素是唯一的,即不会有重复的值。因此,可以将数组中的元素添加到Set中,由于Set的去重特性,重复的元素会自动被去除,然后再将Set转换回数组,就得到了去重后的数组。
  • 示例
const arrayWithDuplicates = [1, 2, 3, 2, 4, 3, 5];
const uniqueArray = [...new Set(arrayWithDuplicates)];
console.log(uniqueArray);

在上述示例中,通过new Set()将包含重复元素的数组arrayWithDuplicates转换为Set对象,然后使用扩展运算符...Set对象转换回数组,从而实现了数组去重,得到了[1, 2, 3, 4, 5]

并集、交集和差集运算

  • 并集:可以通过将多个Set对象合并为一个新的Set对象来实现并集运算。首先将两个或多个数组转换为Set对象,然后使用SetaddAll方法(或使用扩展运算符...)将它们合并为一个新的Set,最后再转换回数组。
const set1 = new Set([1, 2, 3]);
const set2 = new Set([3, 4, 5]);
const unionSet = new Set([...set1,...set2]);
console.log([...unionSet]);

在这个示例中,通过将set1set2中的元素合并到一个新的Set对象unionSet中,得到了并集[1, 2, 3, 4, 5]

  • 交集:要计算两个Set对象的交集,可以使用Sethas方法来判断一个元素是否同时存在于两个Set中,然后将共同的元素添加到一个新的Set对象中。

    const set3 = new Set([1, 2, 3, 4]);
    const set4 = new Set([3, 4, 5, 6]);
    const intersectionSet = new Set([...set3].filter(x => set4.has(x)));
    console.log([...intersectionSet]);
    

    上述示例中,首先将set3转换为数组,然后使用filter方法筛选出同时存在于set4中的元素,最后将这些元素添加到新的Set对象intersectionSet中,得到交集[3, 4]

  • 差集:计算差集可以通过从一个Set对象中排除另一个Set对象中存在的元素来实现。同样,可以先将Set对象转换为数组,然后使用filter方法排除共同的元素。

const set5 = new Set([1, 2, 3, 4]);
const set6 = new Set([3, 4, 5, 6]);
const differenceSet1 = new Set([...set5].filter(x =>!set6.has(x)));
const differenceSet2 = new Set([...set6].filter(x =>!set5.has(x)));
console.log([...differenceSet1]); 
console.log([...differenceSet2]);

在这个示例中,分别计算了set5set6的差集differenceSet1[1, 2],以及set6set5的差集differenceSet2[5, 6]

元素的存在性检查

  • 由于Set对象的查找速度相对较快,可以使用Set来快速检查一个元素是否存在于一个集合中。只需使用Sethas方法即可判断元素是否在Set中,相比于在数组中使用indexOfincludes方法,在大数据量的情况下,Set的性能优势更加明显。
const mySet = new Set([10, 20, 30, 40]);
console.log(mySet.has(20)); 
console.log(mySet.has(50));

在上述示例中,通过has方法可以快速判断20存在于mySet中,而50不存在。

数据结构转换

  • Set对象可以方便地与其他数据结构进行转换。除了前面提到的与数组的相互转换外,还可以将Set对象转换为对象等其他数据结构,以满足不同的编程需求。
    const set7 = new Set([['name', 'Alice'], ['age', 30]]);
    const obj = Object.fromEntries(set7);
    console.log(obj);
    
    在这个示例中,将一个包含键值对的Set对象set7通过Object.fromEntries方法转换为了一个普通对象obj,得到{ name: 'Alice', age: 30 }

注意事项

  • 遍历顺序:虽然Set对象中的元素是无序的,但在实际遍历过程中,元素的顺序是按照插入的顺序来的。需要注意的是,不同浏览器或JavaScript引擎可能会有略微不同的遍历顺序,因此在对遍历顺序有严格要求的场景中,需要谨慎使用Set
  • 对象作为元素Set中的元素是根据严格相等(===)来判断是否重复的,对于对象类型的元素,即使两个对象的内容相同,但它们在内存中是不同的对象,因此会被视为不同的元素添加到Set中。如果需要对对象数组进行去重等操作,可能需要根据对象的特定属性来进行比较和处理,而不能直接使用Set

Set类型在JavaScript中提供了一种方便、高效的集合数据结构,在数组去重、集合运算、数据存在性检查等方面都有广泛的应用,能够帮助开发者更简洁、高效地处理数据。

相关文章
|
存储 算法 PHP
数组去重性能优化:为什么Set和Object哈希表的效率最高
在处理数组去重问题时,使用 `Set` 和 `Object` 哈希表是高效的解决方案。它们基于哈希表实现,插入和查找操作的时间复杂度为 `O(1)`,相比传统嵌套循环的 `O(n²)` 方法性能优势显著。`Set` 能保持元素插入顺序,适用于需要顺序的场景;`Object` 则通过键的唯一性实现去重,适合无需顺序的场景。两者均能在大规模数据中实现高效的去重操作,是数组去重最优选择。
Set ——最简单的数组去重
Set ——最简单的数组去重
194 0
数组去重-set
ES6 提供了新的数据结构 Set 它类似于数组,但是成员的值都是唯一的,没有重复的值 (set本身是一个构造函数,用来生成 Set 数据结构)
|
Windows
【CCCC】L2-005 集合相似度 (25分),维护set数组去重,比较统计
【CCCC】L2-005 集合相似度 (25分),维护set数组去重,比较统计
314 0
ES6 数组去重的最佳实践:Set 结合 Array.from() | 拓展运算符结合 Set
一直想写个ES6特性的系列文章,整理了一段时间,不想写概而全的纯理论,只想写一些贴近工作的, 最常用到的,比如块级作用域,箭头函数,字符串模板等等---敬请期待 上面那两个方法并不是万能的,只能作为常规的数组去重,因为涉及到对象或者多维数组的去重, 还是需要其他一些方法来辅助,该遍历遍历,该比较还是得比较。。。。
451 0
重学ES系列之Set实现数组去重、交集、并集、差集
重学ES系列之Set实现数组去重、交集、并集、差集
|
10月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
10月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
516 2
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
757 1