一、集合的特点:
由一组无序的,不能重复的元素构成;
不能通过下标进行访问;
二、这里我实现了:
增:
删:
- remove,移除指定项,成功返回true,失败返回false
- clear,移除所有项
查:
其他:
- size,包含元素个数
-
values,返回包含所有集合元素的数组
集合间的操作:
- union,交集
- intersection,并集
- difference,差集
- isSubsetTo,子集
三、问题或不足
边界判断没做完善
四、难的点就说一下isSubsetTo吧:
这里可以不用for循环,数组里原本就有个every方法,对数组每一项都运行传入的函数,如果每一项都返回true,则这个方法返回true;
五、源码
function Set() {
// 属性
this.items = {};
Set.prototype.add = function (value) {
// 判断当前集合中是否包含该元素
if (this.has(value)) {
return false;
}
// add
this.items[value] = value;
return true;
};
Set.prototype.has = function (value) {
return this.items.hasOwnProperty(value);
};
Set.prototype.remove = function (value) {
// ?
if (!this.has(value)) return false;
delete this.items[value];
return true;
};
Set.prototype.clear = function () {
this.items = {};
};
Set.prototype.size = function () {
return Object.keys(this.items).length;
};
Set.prototype.values = function () {
return Object.keys(this.items);
};
Set.prototype.union = function (set) {
// new
let newSet = new Set();
// old
let valuesArr = this.values();
for (let i = 0; i < valuesArr.length; i++) {
newSet.add(valuesArr[i]);
}
// other
valuesArr = set.values();
for (let i = 0; i < valuesArr.length; i++) {
newSet.add(valuesArr[i]);
}
return newSet;
};
Set.prototype.intersection = function (otherSet) {
let intersection = new Set();
let values = this.values();
let otherSet_values = otherSet.values();
if (values.length <= otherSet_values.length) {
for (let i = 0; i < values.length; i++) {
if (otherSet.has(values[i])) {
intersection.add(values[i]);
}
}
} else {
for (let i = 0; i < otherSet_values.length; i++) {
if (this.has(otherSet_values[i])) {
intersection.add(otherSet_values[i]);
}
}
}
return intersection;
};
Set.prototype.difference = function (otherSet) {
let difference = new Set();
let values = this.values();
for (let i = 0; i < values.length; i++) {
if (!otherSet.has(values[i])) {
difference.add(values[i]);
}
}
return difference;
};
Set.prototype.isSubsetTo = function (otherSet) {
// 判断this是不是otherSet的子集
let values = this.values();
if (
values.every((item) => {
return otherSet.has(item);
})
) {
return true;
}
return false;
};
}
|