TypeScript Set med anpassad likhetsmetod
Jag försöker för närvarande göra följande. Jag använder ett Set för att lagra objekt. Eftersom Typescript använder SameZeroEquality för att jämföra objekt kommer standardhashen inte att fungera.
Så jag försöker bygga en AdvancedSet som definierar en anpassad has-metod. Hittills ser det ungefär ut så här
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;
}
}
}
Nu kommer detta uppenbarligen inte att fungera eftersom jag itererar genom mängden, vilket kommer att vara smärtsamt långsamt och jag kunde ha använt en array från början.
I princip kommer jag att behöva skriva om getHash och equals för att uppnå något som fungerar. Är detta alls möjligt med set eller måste jag i princip bygga en klass HashTable från grunden?