【问题标题】:Why this includes() return false?为什么这包含()返回false?
【发布时间】:2020-10-12 00:48:04
【问题描述】:

我正在使用 nodejs 创建一个 API,并且我有以下数据集

[ { _id: 5ef054487c20460017dcbde8,
post_data: 'paw nisa dmme  vahi ponnaya',
likes: 2,
commentsCount: 0,
post_img: null,
isUserLiked: false,
usersLiked: [ 5eef7fc55de48230887f3aa3 ],
exp_date: 2020-06-27T00:00:00.000Z,
has_img: false,
user_id: [ [Object] ],
typology: 'post',
geometry:
 { pintype: 'Point',
   _id: 5ef054487c20460017dcbde9,
   coordinates: [Array] },
created: 1592808520819,
category: [],
createdAt: 2020-06-22T06:48:40.821Z,
updatedAt: 2020-06-22T07:29:00.148Z } ]

在那里我有usersLiked 数组,我将上述结果转换为posts 变量并使用以下代码更改isUserLiked

            posts.forEach((post) => {
                post.isUserLiked = post.usersLiked.includes(user_id)
            });

问题是post.usersLiked.includes(user_id) 总是返回 假的

我的 mongodb 长这样。

我已经尝试过post.isUserLiked = post.usersLiked.includes(mongoose.Types.ObjectId(user_id)),但它给出了相同的输出?这可能是什么问题,我该如何解决?

【问题讨论】:

  • 在比较之前将Object ID转换为字符串。
  • id, user_idusersLiked 的内容是ObjectId 类型的对象。 .include() 使用 SameValueZero 算法将对象作为对象进行比较。如果它们不相同 (===),则结果将是 false。将 id 转换为字符串,然后进行比较。

标签: javascript node.js arrays mongodb mongoose


【解决方案1】:
post.isUserLiked = post.usersLiked.some(id => id.toString() === user_id)

如果user_id 不是字符串,则使用.equals。在这里查看https://stackoverflow.com/a/11638104/8443899

【讨论】:

  • 为什么 OP 应该在 id 上调用 .toString()?为什么不在user_id 上?
  • 我以为user_id 是一个字符串。
  • 已解决 post.isUserLiked = post.usersLiked.some(id => id.equals(user_id)) 解决问题
  • @SuthuraSudharaka 因为你说“user_id”是一个字符串,使用 id.toString() === user_id 会更好,因为它比 equals() 快 2 倍。
【解决方案2】:

我认为问题在于您向我们展示的这个数据集,usersLiked: [ 5eef7fc55de48230887f3aa3 ], 有一个不是字符串的数组。

如果这个 ID 是一个字符串,那么你可以使用 usersLiked.includes('ANOTHER STRING HERE')

当我指的是字符串时,我的意思是应该是这样的:usersLiked: [ '5eef7fc55de48230887f3aa3' ]

【讨论】:

  • 我不知道 user_id,但我的意思是用户喜欢的数组,你向我们展示的,没有引号作为字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多