我目前正在尝试执行以下操作。我正在使用Set来存储对象。现在,由于Typescript使用SameZeroEquality来比较对象,因此默认设置将不起作用。
因此,我尝试构建一个定义自定义has方法的AdvancedSet。到目前为止看起来有点像
interface AdvancedSetOptions<T> {
equal?: (a: T, b: T) => boolean;
}
const defaultOptions: AdvancedSetOptions<any> = {
}
export class AdvancedSet<T> extends Set<T>{
constructor(Options: AdvancedSetOptions<T> = defaultOptions) {
super();
super.has = Options.equal ? this.getHasFromValidator(Options.equal) : super.has;
}
private getHasFromValidator(validator: ((a: T, b: T) => boolean)): (value: T) => boolean {
return function(value: T): boolean {
let found = false;
let iterator = this.values();
let entry = iterator.next();
while (entry.value) {
if (entry.value) {
if (validator(entry.value, value)) {
found = true;
break;
}
}
entry = iterator.next();
}
return found;
}
}
}
现在这显然将不起作用,因为我正在遍历整个集合,这将非常缓慢,因此我本来可以使用数组。
基本上,我将不得不重写getHash和equals来实现正常工作。使用set完全可行吗?还是我基本上必须从头开始构建类HashTable?