javascript - 检查对象数组是否已更改

标签 javascript arrays json algorithm

我有一个可以包含对象的数组。可以向其中添加对象或修改属性。我想检查数组是否发生了变化(可能是添加了元素,或者只是更改了一个对象的键),然后根据潜在的变化更新数据库。

只是想知道我所拥有的是否可以涵盖所有情况和/或是否有更好的方法来做到这一点。

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/

相关文章:

php - 在 Symfony2 中访问 HTTP PUT 数据

java - 如何用Java读取JSON数据

python - 逐行读取文件,并获取以某个单词开头的行?

javascript - 在 Google map 标记上显示信息

javascript - 将数组对象连接成一个字符串

php - PHP header 中的数组在 WordPress 中不是全局的

javascript - 使用jquery读取递归数组

javascript - 如何使用 YDN-DB 获取键路径后的下一个元素

javascript - 如何通过jquery和javascript检测键盘上的三个按下的键

c - 共享内存,用于共享一个相同结构的数组