将 ObjectId 数组与 ObjectId 进行比较
Comparing array of ObjectIds to ObjectId
我有一个曾经在我的代码中工作的简单用例,但是现在我不得不进行更改以适应我现在遇到的问题。希望深入了解为什么会发生这种变化,并且需要额外检查是否有人可以提供帮助。我的场景和描述的一样。
我有一个数组 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[]
附近,我遗漏了什么?
当您比较对象时,它们必须是完全相同的对象,而不是具有相同属性的对象。
可能您的代码在其他地方或库中发生了一些变化,基本上变成了这样:
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()
比较两个(相同的 或 等效)ObjectIds。
// 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.some
returns true
如果任何数组条目匹配回调函数,就像 includes
对值所做的那样。
我有一个曾经在我的代码中工作的简单用例,但是现在我不得不进行更改以适应我现在遇到的问题。希望深入了解为什么会发生这种变化,并且需要额外检查是否有人可以提供帮助。我的场景和描述的一样。
我有一个数组 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[]
附近,我遗漏了什么?
当您比较对象时,它们必须是完全相同的对象,而不是具有相同属性的对象。
可能您的代码在其他地方或库中发生了一些变化,基本上变成了这样:
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()
比较两个(相同的 或 等效)ObjectIds。
// 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.some
returns true
如果任何数组条目匹配回调函数,就像 includes
对值所做的那样。