Array.includes总是错误的javascript

时间:2017-02-23 17:04:21

标签: javascript arrays mongoose

我有以下对象

{ _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);
})

3 个答案:

答案 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))