以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]);
}
現在,編譯器會抱怨,如果你嘗試傳入兩個不兼容的對象進行比較。