Array.includes 总是错误的 javascript
Posted
技术标签:
【中文标题】Array.includes 总是错误的 javascript【英文标题】:Array.includes always false javascript 【发布时间】:2017-07-14 07:16:22 【问题描述】:我有以下对象
_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)
返回真
编辑:对象是mongoose.document
。上面的对象正是我执行时它被记录到控制台的方式
Club.findById(id (err, club) =>
console.log(club);
)
【问题讨论】:
发布的代码在语法上不正确;58a5ac4f84230a2117d1d6cb
不是有效数字。
var x = [58a5ac4f84230a2117d1d6cb, 111111]
导致语法错误 ► var x = [2222,1111]
有效,所以 ► var x = ['58a5ac4f84230a2117d1d6cb',111111111111111111111111]
58a5ac4f84230a2117d1d6cb是什么数据类型?
它是 mongoose.Schema.Types.ObjectId。当我从猫鼬查询将其记录到控制台时就是这样。
第二个注意事项,你怎么没注意到SyntaxError: Unexpected identifier
在任何阶段?
【参考方案1】:
正如Pointy 指出的(呵呵),您在数组上使用的值58a5ac4f84230a2117d1d6cb
不是有效数字。由于无效,您的对象可能没有被正确定义,因此所有内容都将返回false
,因为没有定义任何内容。
我已经测试过了
object.instructors.includes(111111111111111111111111)
,它可以工作。我相信你的问题出在58a5ac4f84230a2117d1d6cb
,如果你真的想保留,应该用引号括起来成为一个字符串。
【讨论】:
对象是一个 mongoose.document。上面的对象正是它被记录到控制台的方式。我没有将它创建为一个库,我只是指它。【参考方案2】: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
假设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
【讨论】:
您的回答最接近我的实际解决方案。 lodash 你指的是图书馆吗?还是这是一个与生俱来的 js 特性? lodash 是一个库,做npm i lodash --save
,我遇到了类似你的东西,像 (object._id === 'some object ID')
那样做总是返回 false,甚至 object._id
和比较 id
是由于相同的原因另一个对象的实例一些oops
概念,无论如何,lodash isEqual
进行深度比较,返回true
【参考方案3】:
如果您在 js 循环中使用 includes,请注意在 for...in 循环和 循环之间有一个棘手的提示 >传统循环。检查 sn-p ;)
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))
【讨论】:
以上是关于Array.includes 总是错误的 javascript的主要内容,如果未能解决你的问题,请参考以下文章
'number'类型的参数不能分配给array.includes()中'never'类型的参数
使用 Array.includes() 和测试重复项的 JavaScript 问题