Набор TypeScript с пользовательским методом equals - PullRequest
0 голосов
/ 20 ноября 2018

Я сейчас пытаюсь сделать следующее.Я использую набор для хранения объектов.Теперь, когда Typescript использует SameZeroEquality для сравнения объектов, значение по умолчанию не будет работать.

Так что я пытаюсь создать AdvancedSet, который определяет пользовательский метод has.Пока это выглядит примерно так:

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 с нуля?

...