首页 > 解决方案 > 带有自定义 equals 方法的 TypeScript Set

问题描述

我目前正在尝试执行以下操作。我正在使用 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?

标签: typescriptsetgethashcodedeepequals

解决方案


推荐阅读