【问题标题】:why does Javascript comparison not work with objects? [duplicate]为什么Javascript比较不适用于对象? [复制]
【发布时间】:2015-09-26 08:25:54
【问题描述】:

我这里有简单的代码。

它的目的是验证用户与写帖子的用户,并允许经过验证的用户编辑帖子。

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 对象,那么您会看到除了字符串值之外的一堆其他内容。
  • JavaScript 中什么样的对象记录了字符串值但不是原始字符串?

标签: javascript node.js


【解决方案1】:

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()) {
    ...
}

【讨论】:

    【解决方案2】:

    人们提到了toString(),但 mongo 也有自己的 ObjectIds 方法。您可以使用:

    post.author.user_id.equals(req.user._id)

    【讨论】:

      【解决方案3】:

      您必须比较 mongodb 标识符对象的字符串表示形式。

      试试这个:

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

      【讨论】:

        【解决方案4】:

        在两个objects 上都使用toString()

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

        【讨论】:

          【解决方案5】:

          以下内容适合您:

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

          【讨论】:

          • 哦,弗莱迪也有同感。
          【解决方案6】:

          这个问题已经回答了here,但是为了明确的目的......

          如果你使用underscore,你可以直接使用_.isEqual(obj1, obj2);

          但是,没有好的通用方法可以做到这一点。有关详细信息,请阅读有关 SO 的其他类似问题。

          【讨论】:

            【解决方案7】:

            您可以通过从要比较的对象中生成 json 对象来仅比较属性: JSON.stringify(obj1) === JSON.stringify(obj2)

            虽然它不会检查属性的方法和类型,但它是最简单且可能最快的实现方式

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-06
              • 2012-11-26
              • 2021-05-05
              • 1970-01-01
              • 2015-07-16
              • 1970-01-01
              • 1970-01-01
              • 2020-09-04
              相关资源
              最近更新 更多