我正在尝试比较两个文档(实际上是同一记录的当前版本和先前版本),以确定文档根目录上的数组内容是否不同。但是我专门寻找的是在根数组中 内的嵌入式数组的更改。
我的文档结构如下:
{
_id: 1,
name: {
first: "John",
last: "Smith"
},
services: [
{
service: "serviceOne",
// I want to detect differences at this "history" array level
history: [
{
_id: <ObjectId>,
title: value
},
{
_id: <ObjectId>,
title: value
}
]
},
{
service: "serviceTwo",
history: [
{
_id: <ObjectId>,
title: value
},
{
_id: <ObjectId>,
title: value
}
]
},
]
}
如何检查“历史”数组级别的两个文档之间是否存在差异?
答案 0 :(得分:2)
比较所有_id
和title
:
const compare = cb => (a, b) => a.length === b.length && a.every((el, i) => cb(el, b[i]));
const take = (key, cb) => (a, b) => cb(a[key], b[key]);
const equal = take("services", compare(
take("history", compare(
(a, b) => a._id === b._id && a.title === b.title
))
))(obj, obj2);
或者,如果格式(键的顺序)在两个版本之间没有改变,则可以简化为:
JSON.stringify(obj) === JSON.stringify(obj2)
答案 1 :(得分:0)
您可以使用此:
function compareObjects(obj1,obj2,reversed){
for(var key in obj1){
if(typeof obj2[key]=="undefined") return false
if(typeof obj1[key] == "object"){
if(!compareObjects(obj1[key],obj2[key])) return false
}
else if(obj1[key]!=obj2[key]) return false
}
return reversed ? true : compareObjects(obj2,obj1,true)
}
通过
var new_history = new_document.services.map(service=>service.history)
var old_history = old_document.services.map(service=>service.history)
var are_identical = compareObjects(new_history,old_history)
无论结构如何,都会递归查找差异。