正在将ObjectId数组与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()可以比较两个(相同的等效的(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.some返回true,就像includes对值所做的那样。

最新更新