为什么Javascript比较不能用于对象?
我在这里有简单的代码。
其目的是validation用户与写博客的用户,并允许经过validation的用户编辑post。
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'
这意味着它们在价值上是平等的,而且在types上也是相同的
我也尝试过==
,但这也行不通。
我怀疑需要做些什么来比较对象,但我不知道我应该做什么。
当Javascript要求比较两个对象时,比较对象的地址,而不是对象本身。 所以是的,你的对象有相同的价值,但不在内存中的同一个地方。
您可以尝试提取新variables中的id并比较(或将它们转换为string并比较string)。
例子:
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()) { ... }
人们提到了toString()
,但是mongo也有自己的ObjectIds方法。 您可以使用:
post.author.user_id.equals(req.user._id)
您必须比较mongodb标识符对象的string表示forms。
尝试这个:
req.user._id.toString() === post.author.user_id.toString()
在两个objects
上使用toString()
。
if(req.user._id.toString() === post.author.user_id.toString()) {
下面将为你工作:
req.user._id.toString() === post.author.user_id.toString()
这个问题已经在这里得到解答,但是为了明确的目的…
如果你使用下划线 ,你可以做
_.isEqual(obj1, obj2);
但是,这样做没有一个好的一般方法。 有关详细信息,请阅读SO上的其他类似问题。
JSON.stringify(obj1) === JSON.stringify(obj2)
你可以比较只有属性通过使json对象的对象进行比较:
虽然它不会去检查属性的方法和types,但是实现它是最简单和可能最快的比较