我是angular2和打字稿的新手。我在创建像Set<>这样的独特集合时遇到问题。 我想避免集合中的重复对象,为此目的,尝试使用 一个set dataType,如下面的代码:
private cardItems = new Set<MyBean>([]);
MyBean是一个对象。
export class MyBean {
id:integer
ownerId:integer
ownerName:string
img: string;
constructor() {
}
public equals(obj: MyBean) {
console.log(obj.id);
if (this.id == obj.id) {
console.log(obj.id);
return true;
}
if (obj == null)
return false;
return true;
}
public hashCode(obj: MyBean) {
return obj.id
}
}
但是equals和hashCode不会以这种方式运行。我在set中有重复的对象。
实施Set?
的解决方案是什么?非常感谢
答案 0 :(得分:4)
如何扩展Set
类然后重写add
方法:
interface SetItem {
equals(other: SetItem): boolean;
}
class MySet<T extends SetItem> extends Set<T> {
add(value: T): this {
let found = false;
this.forEach(item => {
if (value.equals(item)) {
found = true;
}
});
if (!found) {
super.add(value);
}
return this;
}
}
答案 1 :(得分:1)
实施Set
的解决方案是什么?
JavaScript Set
使用与===
相同的算法,并且无法在JavaScript类中覆盖。
您可以使用利用可覆盖功能的内容,例如https://github.com/basarat/typescript-collections使用toString
。
答案 2 :(得分:0)
您可以使用类似于两个对象相似时进行比较的技术:
JSON.stringify(obj)
但是,这将要求您在阅读时JSON.parse()
集合中的成员,并且需要进行一些额外的键入。
const obj1 = {id: 1, data: 'blue'};
const obj2 = {id: 2, data: 'red'};
const obj3 = {id: 1, data: 'blue'};
const myStringifiedObjSet: Set<string> = new Set([]);
myStringifiedObjSet.add(JSON.stringify(obj1));
// Set { '{"id":1,"data":"blue"}' }
myStringifiedObjSet.add(JSON.stringify(obj2));
// Set { '{"id":1,"data":"blue"}', '{"id":2,"data":"red"}' }
myStringifiedObjSet.add(JSON.stringify(obj3));
// Set { '{"id":1,"data":"blue"}', '{"id":2,"data":"red"}' }
myStringifiedObjSet.has(JSON.stringify(obj1));
// true
const objArray: object[] = Array.from(myStringifiedObjSet).map(el => JSON.parse(el));
// [ { id: 1, data: 'blue' }, { id: 2, data: 'red' } ]