javascript之数据结构(二) - 集合


一、集合

集合是什么?
1.几乎每种编程语言中,都有集合结构
2.集合比较常见的实现方法是哈希表
3.集合通常是一组无须、不能重复的元素构成
4.和数学中的集合名词比较相似,但是数学中的集合范围更大一些,也允许集合中的元素重复
5.在计算机中,集合通常表示的结构中元素是不允许重复的

集合和数组比较:集合是特殊的数组
1.特殊之处在于里面的元素没有顺序,也不能重复
2.没有顺序意味不能通过下标值进行访问,不能重复意味着相同对象在集合中只会存在一份

1.ES6中的Set

javascript中也有集合结构:Set

Set是ES6新的数据结构,类似数组。Set对象是值的集合,你可以按照插入的顺序迭代它的元素。

Set中的元素只会出现一次,即 Set 中的元素是唯一的。

let set = new Set()
set.add(1)
set.add(2)
set.add(2)
set.add(3)
for(let item of set){
  console.log(item) //1,2,3
}
set.delete(1) //删除元素
set.has(2) //true,判断是否存在该元素

接收一个数组用来初始化

let s=new Set([1,2,3,3])
[...s] //1,2,3

依照集合中元素不会出现重复的特性,我们可以用Set来实现数组去重

var arr = [1,2,2,6,3,2,4,6]
Array.from(new Set(arr))  //[1,2,6,3,4]

2.封装Set类

我们也可以自己手动封装一个简单的Set类

代码如下(示例):

function Set() {
	//集合数据存放
	this.items = {}

	//添加元素进入集合
	Set.prototype.add = function(value) {
		if(this.has(value)) {
			return false
		}
		this.items[value] = value
		return true
	}
	//has,判断集合中是否存在元素
	Set.prototype.has = function(value) {
		return this.items.hasOwnPeoperty(value)
	}
	//remove
	Set.prototype.remove = function(value) {
		if(this.has(value)) {
			return false
		}

		//删除元素
		delete this.itmes[value]
		return true
	}
	//clear
	Set.prototype.clear = function() {
		this.items = {}
	}
	//size
	Set.prototype.size = function() {
		return Object.keys(this.items).length
	}
	//values
	Set.prototype.values = function() {
		return Object.keys(items)
	}
}

测试:

var set = new Set()
set.add(10)
set.add(20)
set.add(10)
alert(set.values())

二、实现基本集合操作

1.并集

代码如下(示例):

	//union ,求两个集合的并集,并返回一个新集合
	Set.prototype.union = function(otherSet) {
		var unionSet = new Set()

		var values = this.values()
		for(var i = 0; i < values.length; i++){
			unionSet.add(values[i])
		}

		var otherValues = otherSet.values()
		for(var i = 0; i < otherValues.length; i++){
			unionSet.add(otherValues[i])
		}

		return unionSet
	}

测试:

var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set1.add(1)
set1.add(3)
set1.add(4)
set1.add(7)
console.log(set.union(set1)) // [1,2,3,4,7]

2.并集

//intersectionSet,求两个集合的交集,并返回一个新的集合
	Set.prototype.intersection = function(otherSet) {
		//创建一个新的空的集合
		var intersectionSet = new Set()

		var values = this.values()
		for(var i = 0; i < values.length; i++) {
			if(otherSet.has(values[i])){
				intersectionSet.add(values[i])
			}
		}

		return intersectionSet
	}

测试:

var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set1.add(1)
set1.add(3)
set1.add(4)
set1.add(7)
console.log(set.intersection(set1))  // [1,3],

3.差集

//differenceSet,求两个集合的差集,并返回一个新的集合
	Set.prototype.difference = function(otherSet) {
		//创建一个新的空的集合
		var differenceSet = new Set()

		var values = this.values()
		for(var i = 0; i < values.length; i++) {
			if(!otherSet.has(values[i])){
				differenceSet.add(values[i])
			}
		}

		return intersectionSet
	}

测试:

var set = new Set()
set.add(1)
set.add(2)
set.add(3)
var set1 = new Set()
set1.add(1)
set1.add(3)
set1.add(4)
set1.add(7)
console.log(set.difference(set1))  // [2]

4.子集

//subset, s2.subset(s1) 判断是s1是不是s2的子集
	Set.prototype.subset = function(otherSet) {
		var len = otherSet.values()
		var values = this.values()

		if(len > values.length){
			return fasle
		}

		for(var i =0; i < len.length; i++){
			if(!this.has(len[i])){
				return false
			}
		}

		return true
	}

测试:

var set = new Set()
set.add(1)
set.add(2)
set.add(3)

var set1 = new Set()
set.add(1)
set.add(2)
console.log(set.subset(set1))  // true

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页