我有一個用于在我的代碼中作業的簡單用例,但是現在我必須進行更改以適應我現在遇到的問題。希望深入了解為什么這種情況發生了變化,并且需要額外檢查是否有人可以提供幫助。我的情況如所述。
userBadgeIds我有一個包含以下內容的陣列:[ new ObjectId("59f347fca0f50c0004b5a3ac") ]
我曾經做過以下幾行:const exists = userBadgeIds.includes(badge._id)它作業得很好,并告訴我輸入badge._id是否在陣列中。兩者都是貓鼬ObjectId,因此以這種方式比較等價物似乎很完美(再次,它奏效了!)。
但是,無論出于何種原因,我現在必須按以下方式比較它們:
const exists = userBadgeIds.map(String).includes(badge._id.toString())
現在它又可以作業了。關于.includes比較等價的方式,我是否遺漏了一些東西,或者我在ObjectId專門比較周圍時遺漏了ObjectId[]什么?
uj5u.com熱心網友回復:
比較物件時,它們必須是完全相同的物件,而不是具有相同屬性的物件。
您的代碼在其他地方或在庫中可能發生了一些變化,這些變化基本上是這樣的:
const obj1 = { _id: 'a' };
const obj2 = { _id: 'b' };
const obj3 = { _id: 'c' };
const searchFor = obj1;
[obj1, obj2, obj3].includes(searchFor); // true
進入本質上是這樣的東西:
const obj1 = { _id: 'a' };
const obj2 = { _id: 'b' };
const obj3 = { _id: 'c' };
const searchFor = { _id: 'a' };
[obj1, obj2, obj3].includes(searchFor); // false
searchFor可能具有相同的屬性和原型,但它與obj1. 也許某些代碼正在克隆badge,使其不等于userBadgeIds陣列中的條目。
您的解決方法有效,因為當您比較字串時,它們不必是完全相同的字串,只需具有相同的值即可。
順便說一句,ObjectId.prototype.equals()要比較兩個(相同或等效的)ObjectId。
// You need to pass searchFor as the second parameter to `some`
// so that `this` is correctly set.
[obj1, obj2, obj3].some(searchFor.equals, searchFor);
// Or you can do:
[obj1, obj2, obj3].some(searchFor.equals.bind(searchFor));
// Or:
[obj1, obj2, obj3].some(id => searchFor.equals(id));
Array.prototype.sometrue如果任何陣列條目與回呼函式匹配,則回傳,就像includes值一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424004.html
標籤:javascript 打字稿 mongodb 猫鼬
