Array.includes 总是 false javascript

xer*_*ant 4 javascript arrays mongoose

我有以下对象

{ _id: 58ae39c54473f9cfd4eb29b6,
  email: 'another@club.com',
  name: 'Another Club Renamed',
  __v: 0,
  createdEvents: [],
  instructors: [ 58a5ac4f84230a2117d1d6cb, 111111111111111111111111 ],
  members: [] }
Run Code Online (Sandbox Code Playgroud)

当我使用该方法时

object.instructors.includes(58a5ac4f84230a2117d1d6cb) object.instructors.includes(111111111111111111111111)

或者

object.instructors.includes('58a5ac4f84230a2117d1d6cb') object.instructors.includes("111111111111111111111111")

结果总是错误我做错了什么吗?

Array.isArray(club.instructors) 返回真

编辑:对象是一个mongoose.document. 上面的对象正是我执行时它被记录到控制台的方式

Club.findById(id (err, club) =>{
    console.log(club);
})
Run Code Online (Sandbox Code Playgroud)

p0k*_*k8_ 7

mongo _id 是 12 字节的 BSON 类型 ObjectId,

所以正常object.instructors.includes('58a5ac4f84230a2117d1d6cb')意味着您将原始字符串与 ObjectId 进行比较,后者不是有效的整数或字符串,它将始终返回 FALSE。

注意:进一步理解的提示


使用 lodash 检查存储在多个集合中的相同 ObjectId

npm i lodash --save

在你的 file.js

const _ = require('lodash');

lodash_.isEqual在两个值之间进行深度比较以确定它们是否相等

使用 lodash 并执行_.isEqual深度比较

_.isEqual(object._id, '58ae39c54473f9cfd4eb29b6') // false
_.isEqual(object.instructor[0], '58a5ac4f84230a2117d1d6cb') // false
Run Code Online (Sandbox Code Playgroud)

假设id 58ae39c54473f9cfd4eb29b6来自两个不同的 mongodb 文档

集合用户:[{_id: 58ae39c54473f9cfd4eb29b6, name: 'user1' }] 假设这个用户被引用到rooms集合:

收集室: [{_id: ObjectId, name: 'room1', userId: 58ae39c54473f9cfd4eb29b6}]

如果你做一个正常的比较===或者includes像这样

if (user[0]._id === rooms[0].userId) // false due to different instances

_.isEqual(user[0]._id, rooms[0].userId) // true performs deep comparison
Run Code Online (Sandbox Code Playgroud)


Mat*_*lar 5

正如Pointy指出的那样(呵呵),您在数组上使用的值58a5ac4f84230a2117d1d6cb不是有效数字。由于该无效性,您的对象可能没有被正确定义,因此一切都会返回false,因为没有定义任何内容。

我已经在 上进行了测试 object.instructors.includes(111111111111111111111111),并且有效。我相信你的问题是58a5ac4f84230a2117d1d6cb,如果你真的想保留它,应该用引号引起来成为一个字符串。