JavaScript数据结构——集合
JavaScript数据结构(集合)
集合通常是由一组无序的、不能重复的元素构成
封装集合
集合常见的操作
add(value)
向集合添加一个新的项。remove(value)
从集合移除一个值。has(value)
如果值在集合中,返回true
,否则返回false
。clear()
移除集合中的所有项。size()
返回集合所包含元素的数量。与数组的length
属性类似。values()
返回一个包含集合中所有值的数组。
JavaScript代码实现封装集合
基本方法实现
class Set {
constructor() {
this.item = {}
}
has(value) {
return this.item.hasOwnProperty(value);
}
add(value) {
if (this.has(value)) {
return false;
}
this.item[value] = value;
return true;
}
remove(value) {
if (this.has(value)) {
delete this.item[value];
return true
}
return false;
}
clear() {
this.item = {};
}
size() {
return Object.keys(this.item).length;
}
values() {
return Object.keys(this.item)
}
}
多个集合操作
// 并集
union(setB) {
let unionSet = new Set();
for (let value of this.values()) {
unionSet.add(value)
}
for (let value of setB.values()) {
unionSet.add(value)
}
return unionSet;
}
// 交集
intersection(setB) {
const intersectionSet = new Set();
for (let item of this.values()) {
if (setB.has(item)) {
intersectionSet.add(item);
}
}
return intersectionSet;
}
// 差集
difference(setB) {
const differenceSet = new Set();
for (let item of this.values()) {
if (!setB.has(item)) {
differenceSet.add(item);
}
}
return differenceSet;
}
// 子集判断
subset(setB) {
for (let item of this.values()) {
if (!setB.has(item)) {
return false;
}
}
return true;
}
测试代码
const set = new Set();
set.add(111);
set.add(222);
set.add(333);
console.log(set.values()); // [ '111', '222', '333' ]
console.log(set.has(111)); // true
console.log(set.has(444)); // false
console.log(set.size()); // 3
set.remove(222);
console.log(set.values()); // [ '111', '333' ]
const setB = new Set();
setB.add(111);
setB.add(222);
setB.add(333);
setB.add(555);
console.log(setB.values()); // [ '111', '222', '333', '555' ]
console.log(set.union(setB).values()); // [ '111', '222', '333', '555' ]
console.log(setB.difference(set).values()); // [ '222', '555' ]
console.log(set.intersection(setB).values()); // [ '111', '333' ]
console.log(set.subset(setB)); // true
set.clear();
console.log(set.values()); // []