我正在尝试在服务器上创建“活动日志”类型的东西。我在节点服务器上使用Angular和Mongoose。我要实现的目标是通过进行深层比较将请求正文与存储在数据库中的数据进行比较。
因此,每当API被命中时,我都会运行此功能:
createActivityInformation(currentObject, updatedObject) {
let information = [];
function getChangedItem(currentItem, updatedItem, key, prop){
if(!currentItem || !updatedItem) return
// IF OBJECTS
if(typeof(updatedItem) === "object" && !Array.isArray(updatedItem)){
for(let prop in updatedItem){
getChangedItem(currentItem[prop], updatedItem[prop], key, prop)
}
}
else if(Array.isArray(updatedItem)){
}
else{
if(key != 'updatedAt' && (currentItem && updatedItem) && (currentItem.toString() !== updatedItem.toString())){
// CHECK FOR DATE - THIS IS ADDED BECAUSE DATES ARE COMPARED DIFFERENT THAN TO STRINGS
if(currentItem instanceof Date && !isNaN(currentItem)){
if(new Date(currentItem).getTime() != new Date(updatedItem).getTime()){
information.push({
'changeFrom': { key: key, value: currentItem, prop: prop},
'changeTo': { key: key, value: updatedItem, prop: prop}
})
}
} else {
information.push({
'changeFrom': { key: key, value: currentItem, prop: prop},
'changeTo': { key: key, value: updatedItem, prop: prop}
})
}
}
}
}
for(let key in updatedObject){
getChangedItem(currentObject[key], updatedObject[key], key)
}
return information;
}
基本上,我想做的是存储原始数据和更改后的数据。但是我似乎无法使其完美运行。该方法应该进行比较以比较所有内容,但还应排除某些字段,例如updatedAt
或_id
。
我看了npm软件包deep-diff
,但这没用。甚至可以比较猫鼬包装器,也可以比较实例字符串和布尔值,然后返回布尔值。但是我也想保存当前数据以及更新后的数据。
也许还有其他可以解决我问题的东西吗?
编辑 普通对象,字符串和数字都可以。但是嵌套对象,数组和布尔值似乎让我很难受。
这是一个小提琴: https://jsfiddle.net/xgpcm0h3/