打字稿对象集

时间:2016-10-10 02:37:08

标签: angular typescript collections set

我是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?

的解决方案是什么?

非常感谢

3 个答案:

答案 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;
    }
}

code in playground

答案 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' } ]