我需要做一组数组。Javascript的默认Set不适用于数组,所以我添加了这个新的Typescript类:
export class ArraySet extends Set<any> {
override add(arr: any): any {
super.add(arr.toString());
}
override has(arr): boolean {
return super.has(arr.toString());
}
}
有没有一种方法可以编辑这个类,以便将值作为数组??
目前:
const set = new ArraySet()
set.add([1,1])
set.add([2,1])
set.forEach(e => console.log(typeof(e)))
# string
# string
预期:
const set = new ArraySet()
set.add([1,1])
set.add([2,1])
set.forEach(e => console.log(typeof(e)))
# object # because I want the element to be the array
# object
结合一些建议,您可能不需要覆盖迭代器部分,只需像一样控制集合内部的内容
class ArrayNumberSet extends Set<number[]> {
private readonly keyMap: Map<string, number[]> = new Map();
private key(value: number[]): string {
return JSON.stringify(value);// or value.toString()
}
override add(value: number[]): this {
const key = this.key(value);
const old = this.keyMap.get(key);
if (old) {
this.delete(old);
}
this.keyMap.set(key, value);
super.add(value);
return this;
}
override clear(): void {
this.keyMap.clear();
super.clear();
}
override delete(value: number[]): boolean {
const key = this.key(value);
const old = this.keyMap.get(key);
if (old) {
this.keyMap.delete(key);
return super.delete(old);
}
return false
}
override has(value: number[]): boolean {
return this.keyMap.has(this.key(value))
}
}
这将把[1, 2]
、[2, 1]
、[2, 1, 1]
视为不同的对象。如果你不想这样,可以考虑一组集合,或者从排序数组中构建一个密钥