Javascript/jQuery-从另一个对象更新对象

Javascript/jQuery-从另一个对象更新对象,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我有一个复杂而深刻的对象,storedData.Department,AngularJS正在使用它。当发生需要反映在UI中的更改时,我使用jQuery的$.extend()将来自XHR返回的新对象的更改合并到现有对象中: $.extend(true, storedData.Department, res.data.Department); 当这些变化是累加性的时,这非常有效。不幸的是,任何减法更改都不会从storedData.Department中删除 我可以简单地用更新的对象覆盖stored

我有一个复杂而深刻的对象,
storedData.Department
,AngularJS正在使用它。当发生需要反映在UI中的更改时,我使用jQuery的
$.extend()
将来自XHR返回的新对象的更改合并到现有对象中:

$.extend(true, storedData.Department, res.data.Department);
当这些变化是累加性的时,这非常有效。不幸的是,任何减法更改都不会从
storedData.Department
中删除

我可以简单地用更新的对象覆盖
storedData.Department
对象,但与
$.extend
相比,这会导致性能显著下降


如何有选择地更新
storedData.Department
,仅添加和删除
res.data.Department
中已更改的内容?解决方案需要合理地执行。

您可以使用delete删除原始对象上的属性,这些属性不在XHR调用返回的对象上。这只是删除object.property。您必须循环遍历每个对象上的属性以确定存在什么,但这应该是非常有效的

实际上,在循环中,语法更像这样:delete object[propertyName]可能是一种方法

像这样的东西应该很接近。(我还没有测试过。)


性能问题是由角度模态绑定引起的。B/c当覆盖原始对象时,必须更新所有属性绑定,而不仅仅是更改的属性绑定。就纯JS而言,更改指针不会更快。要删除属性,您必须在这两个对象之间循环,并对您不需要的对象执行“delete object.property”。谢谢您的回复,Mike。你能详细说明一下吗,“你必须循环每个对象的属性来确定存在什么”?当然。我更新了答案。如果这不起作用,它应该非常接近。另外,angular.copy可能会帮你解决这个问题。它首先从目标对象中删除所有属性。由于性能是关键,您可能希望尝试这两种方法,看看哪种方法更有效。
function mirror(source, target) {
    // assign all property values from the source to the target.
    for (var prop in source) {
         target[prop] = source[prop];
    };
    // remote any properties present on the target that aren't in the source.
    for (var prop in target) {
        if (! source[prop]) {
            delete target[prop];
        }
    };
};