检查对象数组是否已更改

时间:2020-01-17 14:56:40

标签: 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将对象转换为字符串应该解决嵌套问题,对吗?有关此实施的任何见解,现在是否有更合适的方法?

1 个答案:

答案 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);

相关问题