这是我的问题。
一方面,我有一个Mongoose对象的普通对象表示。
另一方面,我有一个直接来自数据库中findOne
的Mongoose对象。
我要做的是检查两个对象的两个属性之间是否有任何不同。 让我们考虑一下这种模型:
{
_id: 'abc',
id: 'abc',
things: [{
_id: 'def',
id: 'def',
other_things: [{
_id: 'ghi',
id: 'ghi',
foo: 'bar'
}]
}]
}
我想将myplainobject.things
与mydbobject.things
进行比较。
但是,使用underscore
,_.isEqual(myplainobject.things, mydbobject.things)
总是失败。
这是由第一种情况string
和另一种ObjectID
中的ID引起的。
虽然有很多方法可以将ObjectID
与string
进行比较,但还是有一种优雅方式来比较对象吗?
或者我是否必须实现我自己的解决方案,它将遍历每个子文档并手动比较属性?
答案 0 :(得分:2)
由于此时我没有足够的声誉来为drinchev添加评论,我将在此处添加。首先,使用drinchev建议的toObject()
方法,然后您可以使用类似https://stackoverflow.com/a/14368628/3365039的答案(稍加修改)来确保密钥的顺序相同。
function compareKeys(a, b) {
var aKeys = Object.keys(a).sort();
var bKeys = Object.keys(b).sort();
// Check that the objects contain the same keys.
if (JSON.stringify(aKeys) !== JSON.stringify(bKeys)) {
return false
}
// Check that the keys in each object contain the same values.
for (const key in aKeys) {
if (a[key] !== b[key]) {
return false
}
}
return true
}
compareKeys(mongooseModel.toObject(), jsObject)