【问题标题】:Comparing array of ObjectIds to ObjectId将 ObjectIds 数组与 ObjectId 进行比较
【发布时间】:2022-02-11 20:48:06
【问题描述】:

我有一个简单的用例,以前可以在我的代码中使用,但是现在我不得不进行更改以适应我现在遇到的问题。希望深入了解为什么这种情况发生了变化,并且需要额外检查是否有人可以提供帮助。我的场景如前所述。

我有一个数组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[] 时缺少什么?

【问题讨论】:

标签: javascript typescript mongodb mongoose


【解决方案1】:

当您比较对象时,它们必须是完全相同的对象,而不是具有相同属性的对象。

您的其他地方的代码或库中的某些内容可能发生了变化,这基本上变成了这样:

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 对值所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多