我有以下对象
{ _id: 58ae39c54473f9cfd4eb29b6,
email: 'another@club.com',
name: 'Another Club Renamed',
__v: 0,
createdEvents: [],
instructors: [ 58a5ac4f84230a2117d1d6cb, 111111111111111111111111 ],
members: [] }
当我使用方法时
object.instructors.includes(58a5ac4f84230a2117d1d6cb)
object.instructors.includes(111111111111111111111111)
或
object.instructors.includes('58a5ac4f84230a2117d1d6cb')
object.instructors.includes("111111111111111111111111")
如果我做错了什么,结果总是假的?
Array.isArray(club.instructors)
返回true
编辑:对象是mongoose.document
。上面的对象正好是我执行
Club.findById(id (err, club) =>{
console.log(club);
})
答案 0 :(得分:4)
正如Pointy指出的那样(hehe),您在数组58a5ac4f84230a2117d1d6cb
上使用的值不是有效数字。由于无效性,您的对象可能无法正确定义,因此所有内容都将返回false
,因为没有定义任何内容。
我已经测试过了
object.instructors.includes(111111111111111111111111)
,它有效。我相信你的问题出在58a5ac4f84230a2117d1d6cb
,如果你真的想保留,应该用引号括起来成为一个字符串。
答案 1 :(得分:4)
mongo _id是12字节的BSON类型ObjectId,
正常object.instructors.includes('58a5ac4f84230a2117d1d6cb')
表示您正在将原始字符串与ObjectId进行比较,而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
假设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
答案 2 :(得分:1)
如果你在js循环中使用 includes ,请注意 for ... in 循环和之间的棘手的注释 >传统循环。检查片段;)
for ... in循环仅迭代可枚举属性。从内置构造函数(如Array和Object)创建的对象继承了 Object.prototype和String.prototype的非可枚举属性,例如String的indexOf()方法或Object的toString()方法。
循环将迭代对象本身的所有可枚举属性,以及对象从其构造函数的原型继承的属性(更靠近原型链中对象的属性覆盖原型的属性)。
参考:Mozilla Web docs for javascript
var array = [1, 2, 3, 4, 5]
console.log('** using for..in loops i actually is String')
for (var i in array)
console.log(array.includes(i))
console.log('** using traditional for loops i is integer')
for (var i = 0; i < array.length; i++)
console.log(array.includes(i))