我有一个可以包含对象的数组。可以向其中添加对象或修改属性。我想检查数组是否发生了变化(可能是添加了元素,或者只是更改了一个对象的键),然后根据潜在的变化更新数据库。
只是想知道我所拥有的是否可以涵盖所有情况和/或是否有更好的方法来做到这一点。
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 将对象转换为字符串应该可以解决深层嵌套的更改,对吗?对这个实现有什么见解吗?现在有更合适的方法吗?
最佳答案
使用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);
关于javascript - 检查对象数组是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59789796/