set用法,js中的set和get机制
在某些情况下,Javascript需要使用Set。下面的文章将带你认识集合,介绍什么是集合,什么时候使用集合及其数据运算(交集、差集、交集、对称差集)。
在许多情况下,需要比较多个列表,以获得它们是否有交集、差集等。Javascript中有一种数据类型可以很好地满足这些要求,那就是set。
Set对象类似于数组,但只包含唯一的项。集合是值的集合,它的元素可以按照插入的顺序进行迭代。集合中的元素只会出现一次,即集合中的元素是唯一的。
什么是 Set
集合对象是值的集合,其元素可以按插入顺序迭代。这些元素只会出现一次,也就是说,集合是一个没有按照特定顺序存储并且具有唯一值的集合。与其他集合类型(如堆栈、队列和数组)不同,Set可用于列表比较和检测集合中是否存在某个项目。
Set是一种抽象数据类型,由其行为定义,类似于堆栈和队列数据结构。由于key-key的特性,这与Map类似。
Javascript Set
在JavaScript中设置非常基础简单。它不像其他语言那样提供通用的集合运算函数。它使用一种独特的算法(不是基于严格的等式===)来检测元素是否相同。
这意味着在集合中存储undefined、null和NaN只会存储一次,即使是NaN!==NaN,通常应用于对象类型的存储。
const setTest=新集合([0,-0,无穷大,null,未定义,null,NaN,NaN,Infinity,null]);
console . log(set test);//set {0,infinity,null,undefined,nan}从上面的执行结果可以得出以下结论:
虽然NaN和NaN不相等,但是集合集合中只有一个未定义的无穷,集合中只有一个基本集合。本文就不介绍了。请参考mozilla网站。
什么时候使用 Set
当需要比较一个特定的列表,判断它是否相等时,可以使用Set。下面我们来描述一下适用的场合,主要是数据中的集合运算:
求两个集合的并集求差两个集合的交集求对称差两个集合的交集求差判断两个集合是否为子集问题子集判断两个集合是否为超集问题集合有三种情况介绍集合的相关运算。
Set 操作
在数学中,每当我们谈到集合时,我们都可以进行一些运算。实际上,set是数学有限集的计算机实现。
为了更好地展示代码中的Set操作,示例代码将扩展Javascript Set以继承其属性和方法,并向其添加其他方法。
类SetHelper扩展Set {
/**
*验证该集合是有效的集合。
* @param {*}集
* @返回
*/
_isValid=(set)={
返回Set set.size 0的set instanceof
};
}并集 union
联合操作将合并多个集合对象并返回合并的结果。该实现将当前集合和给定集合合并成一个数组并创建它,从而返回一个新集合。
联合(集){
如果(!这个。_isValid(set))返回新的set helper();
返回新的SetHelper([.这个,set]);
}差集 difference
差运算会返回一个新集合,这个新集合只包含一个集合中的元素而不包含另一个集合中的元素,也就是差集的数学概念。
差异(集合){
如果(!这个。_isValid(set))返回新的set helper();
const difference set=new set helper();
this.forEach((item)={
!set . has(item)difference set . add(item);
});
返回differenceSet
}交集 intersection
交集操作返回一个新集合,该集合只包含两个集合共享的元素。实现将遍历较小的集合(避免不必要的检查),并检查每个项目是否存在于较大的集合中,并将其添加到交集中。遍历完成后,将返回交集。
交叉点(集合){
const intersectionSet=new set helper();
如果(!这个。_isValid(set))返回intersectionSet
const [smallerSet,biggerSet]=
set.size=this.size?【集,本】:【本,集】;
smallerSet.forEach((item)={
bigger set . has(item)intersections et . add(item);
});
返回交叉集;
}对称差集 intersectionDifference
intersectionDifference操作将返回包含两个集合不相交的所有元素的新集合。
交集差(集){
如果(!这个。_isValid(set))返回新的set helper();
返回新的SetHelper([
.这种差异(设定),
.set.difference(本),
]);
}子集 subset
IsSubset操作将确定两个集合是否是子集(当一个集合的所有项目都包含在另一个集合中时)。该实现首先检查两个集合的大小。如果一个集合更大,它不可能是另一个集合的子集。然后,对于每一项,它检查它是否存在于另一项中。
isSubset(set) {
如果(!这个。_isValidSet(set))返回false
返回(
this.size=set.size [.这个】。every((item)=set.has(item))
);
}超集 superset
IsSuperset操作将确定两个集合是否是超集。超集是子集的逆运算。当一个集合包含另一个更小或同等大小的集合的所有项目时,它就是一个超集。
isSuperset(集合){
如果(!这个。_isValidSet(set))返回false
返回(
this.size=set.size [.设置】。every((item)=this.has(item))
);
}
静态 Set
静态集合是始终包含其初始化元素的集合。您不能添加、删除或清除元素。JavaScript不是静态的。它总是可以在创建后公开修改集合的方法,如添加和删除。为了避免集合被修改,您可以创建一个新的集合并重置其修改方法。
类StaticSet扩展SetHelper {
构造者(项目){
超级(物品);
this.add=undefined
this.delete=undefined
this.clear=undefined
}
}
使用
您现在可以使用上面定义的方法操作两套器械包,如下所示:
const setA=new static Set(new Set([1,2,3,4]);
const setB=new static Set(new Set([3,4,5,6]);
console.log([.seta . union(setB)];//[ 1, 2, 3, 4, 5, 6 ]
console.log([.seta . difference(setB)]);//[ 1, 2 ]
console.log([.setA .交叉点(setB)]);//[ 3, 4 ]
console.log([.setb . intersect difference(setA)]);//[5,6,1,2]
总结
设置不限于以上操作。之前已经介绍过,它可用于合并阵列重复数据消除。因为Set和Array的相互转换非常简单,所以在可以使用Array的时候可以优先考虑Set,因为Set比Array占用的内存少。
有关编程的更多信息,请访问:编程视频!也就是JavaScript中设置的是什么?什么时候用?怎么用?更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。