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

假设id58ae39c54473f9cfd4eb29b6来自两个不同的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的使用

浏览器支持 array.includes 和替代品

使用 Array.includes() 和测试重复项的 JavaScript 问题

如何为 JS Array.includes() 提供 equals/hash 函数? [复制]

检查数组中是不是存在迭代器时,array.includes 不起作用[重复]