为什么JavaScript中的对象比较不起作用?

5

我这里有一段简单的代码。

它的意图是验证用户与发布帖子的用户是否相同,并允许已验证的用户编辑该帖子。

exports.edit = function(req, res){
    Post.findById(req.params.post_id, function(err, post){
        if(err){
            return res.json({
                type:false,
                message:"error!"
            });
        }else if(!post){
            return res.json({
                type:false,
                message:"no post with the id"
            })
        }else{
            console.log(req.user._id, typeof req.user._id);
            console.log(post.author.user_id, typeof post.author.user_id);
            if(req.user._id === post.author.user_id){ // doesn't work!!
                return res.json({
                    type:false,
                    message:"notAuthorized"
                }); 
            }else{
                return res.json({
                    type:true,
                    message:"it works",
                    data:post
                }); 
            }
        }
    });
}

控制台显示:

557c6922925a81930d2ce 'object'
557c6922925a81930d2ce 'object'

这意味着它们在价值和类型上是相等的。我也试过使用“==”,但那也不起作用。我怀疑需要做一些比较对象的操作,但我不确定应该做什么。

非常奇怪,这些被记录为字符串,但它们却被称为对象。如果它是一个“String”对象,那么除了字符串值之外,你会看到很多其他的东西。 - Adam Jenkins
在JavaScript中,记录字符串值但不是基本字符串的对象是哪种对象? - Adam Jenkins
7个回答

6

在比较两个对象时,Javascript会比较对象的地址,而不是对象本身。因此,您的对象具有相同的值,但不在内存中相同的位置。

您可以尝试将id提取到新变量中并进行比较(或将它们转换为字符串并比较字符串)。

举个例子:

var id_edit = req.user._id,
    id_post = post.author.user_id;
if (id_edit === id_post) {
    //...
}

或者

if(req.user._id.toString() === post.author.user_id.toString()) {
    ...
}

4
人们提到了toString(),但Mongo也有自己的ObjectIds方法。您可以使用以下方法:post.author.user_id.equals(req.user._id)

3
你需要比较mongodb标识对象的字符串表示。可以尝试以下方法:
req.user._id.toString() === post.author.user_id.toString()

2

使用 toString() 方法,对这两个 objects 进行转换。

if(req.user._id.toString() === post.author.user_id.toString()) {

2
以下内容适用于您:
req.user._id.toString() === post.author.user_id.toString()

哦,Friedi 也持有相同的观点。 - Vikas

2

这个问题已经在这里得到了回答,但为了明确起见...

如果您正在使用underscore,您只需要执行_.isEqual(obj1, obj2);

然而,没有一种通用的方法可以很好地解决这个问题。请阅读SO上其他类似的问题以获取详细信息。


0

您可以通过将要比较的对象转换为 JSON 对象来仅比较属性: JSON.stringify(obj1) === JSON.stringify(obj2)

虽然它不会检查属性的方法和类型,但这是实现最简单、可能也是最快速的比较方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接