我有一个可能包含对象的数组。可以向对象添加对象或修改属性。我想检查数组是否发生了更改(可以是添加元素,也可以只是一个对象更改了键),然后根据可能的更改来更新数据库。
只想知道我所拥有的东西是否能涵盖所有情况,并且/或者是否有更好的方法可以做到这一点。
const origArrayCopy = JSON.stringify(origArray);
someFnThatPotentiallyChanges(origArray);
if (origArrayCopy !== JSON.stringify(origArray)) {
updateDB(arr);
} else {
console.log('NO DIFF');
}
这是我创建的jsFiddle,用于与https://jsfiddle.net/j4eqwmp6/进行测试
使用stringify将对象转换为字符串应该解决嵌套问题,对吗?有关此实施的任何见解,现在是否有更合适的方法?
答案 0 :(得分:1)
当然可以使用JSON.stringify
。
另一种方法是将对象(数组)包装在代理中,并对每个嵌套的对象也这样做。然后捕获使这些对象发生变异的所有动作。
这是看起来如何:
function monitor(obj, cb) {
if (Object(obj) !== obj) return obj;
for (let key of Object.keys(obj)) {
obj[key] = monitor(obj[key], cb);
}
return new Proxy(obj, {
defineProperty(...args) {
cb();
return Reflect.defineProperty(...args);
},
deleteProperty(...args) {
cb();
return Reflect.deleteProperty(...args);
},
set(...args) {
cb();
return Reflect.set(...args);
}
});
};
// Example array
let origArray = [{x: 1}, { child: { y: 1} }];
// Activate the proxy:
let dirty = false;
origArray = monitor(origArray, () => dirty = true);
// Perform a mutation
origArray[1].child.y++;
console.log(dirty); // true
console.log(origArray);