我想比较两个文件(实际上是同一个记录的当前和以前的版本),以确定是否对文件的根数组的内容是不同的。但是,我专门找是根阵列中的嵌入式阵列上的变化。
我的文档结构看起来是这样的:
{
_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
}
]
},
]
}
我如何检查,看看是否有在“历史”阵列的水平两个文件之间的差异?
比较所有的人的_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)
你可以这样做:
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)
它看起来递归的差异,无论是结构。