2017-07-26 99 views
0

這是如何避免在列表中添加重複的對象

export class PersonModel { 

    persCode:number; 
    name:string; 
    contactNumber:number; 
    remarks:string; 
    } 

我有PersonModel

affectedPersons: PersonModel[] = []; 

的對象列表如何檢查對象是否存在我的模型類在這個列表中。這樣我可以避免添加重複的值。

addVisitor() { 
     let visitorVal : PersonModel ; 
     visitorVal = this.affectedPersons.filter(x => x.name == this.visitorName && x.contactNumber== this.visitorMob && x.remarks==this.visitorRemark, x => console.log("x "+ JSON.stringify(x))) 
      .map(x => x)[0]; 

     } 

這是行不通的。我該如何實現這一點

回答

1

以JS函數的形式定義「平等」的概念。這就是他們的目的。

function objectsAreEqual(obj1, obj2) { 
    return obj1.name === obj2.visitorName && 
    obj1.contactNumber === obj2.visitorMob && 
    obj1.remarks === objs.visitorRemark; 
} 

現在你可以找到,如果一個對象是對象數組與

const visitorAlreadyInArray = arr.some(obj => objectsAreEqual(obj, newObj)) 

如果你想找到實際的匹配對象,然後

const visitorVal = arr.find(obj => objectsAreEqual(obj, newObj)) 

filter可以工作在這種情況下,但它不是最好的解決方案。從邏輯上講,過濾器旨在縮小事物的範圍。這不是你想要做的。你正在嘗試找到的一件事。這就是find的用途。它具有的優點是,一旦發現它正在尋找的東西,它就會停止。在合同中,filter將繼續在全部陣列的元素上運行,即使它已經找到第一場比賽。

但是,這不是一個真正理想的解決方案。您已將對象的屬性名稱硬連接到解決方案中。這意味着每次更改或添加屬性時,都必須更改這部分代碼。這不是一件好事。我們希望編寫一個更好的版本,無論屬性如何,它都可以工作。

要做到這一點,您首先需要切換到屬性的一致命名。不要使用一個名稱作爲數組中對象的屬性(name),而使用另一個名稱作爲要嘗試匹配的對象的屬性(visitorName),請對兩者使用相同的名稱(name)。

現在我們可以編寫一個函數來比較任何兩個對象,以確保它們的所有屬性都相同。這是一個老問題。您必須決定是否要嵌套比較這兩個對象,如果它們包含子對象。 Here is a thread on this topic。說

arr.find(obj => compareObjects(obj, newObj)) 

這將

function compareObjects(obj1, obj2) { 
    const obj1Keys = Object.keys(obj1); 
    const obj2Keys = Object.keyw(obj2); 

    return obj1Keys.length === obj2Keys.length && 
    obj1Keys.every(key => obj1[key] === obj2[key]); 
} 

現在我可以用它來在數組中查找匹配對象:如果你只想做一個「淺」的比較,那麼你可以這樣做檢查全部的屬性是相同的。如果你想要檢查一些屬性是否屬於變化,你必須通過傳遞你想檢查的屬性列表來以某種方式調整它。

請注意,這些與TypeScript或Angular沒有任何關係。這是純粹的JavaScript。然而,使用打字稿,你可以寫的方式是通過堅持兩個輸入都爲對象的更多類型安全的compareObjects功能,和相同類型的:

function compareObjects<T extends object>(obj1: T, obj2: T) { 
    const obj1Keys = Object.keys(obj1); 
    const obj2Keys = Object.keyw(obj2); 

    return obj1Keys.length === obj2Keys.length && 
    obj1Keys.every(key => obj1[key] === obj2[key]); 
} 

現在,編譯器會抱怨,如果你嘗試傳入兩個不兼容的對象進行比較。