2016-04-28 8 views
2

複雑で深いオブジェクトであるstoredData.Departmentがあります。これはAngularJSによって使用されています。変更がUIに反映させることの必要性を生じた場合、私は新しいオブジェクトから既存のオブジェクトに変更をマージするためにjQueryの$.extend()を使用していますXHRから返される:変更は添加されているときJavascript/jQuery - 別のオブジェクトからオブジェクトを更新する

$.extend(true, storedData.Department, res.data.Department); 

は、これは素晴らしい作品 。残念ながら、のサブトラクションの変更はstoredData.Departmentから削除されません。

storedData.Departmentオブジェクトを更新されたオブジェクトで上書きすることはできますが、それは$.extendと比べて大幅にパフォーマンスが低下します。

storedData.Departmentを選択して更新するには、res.data.Departmentで変更された内容を追加したり削除したりするにはどうすればよいですか?解決策は、合理的に実行可能である必要があります。

+1

あなたのパフォーマンスの問題は、角のモーダルバインディングによるものです。元のオブジェクトを上書きするときに、プロパティのバインディングがすべて変更されたオブジェクトの代わりに更新されなければならない場合、B/c。純粋なJSが変化するまで、ポインタはそれ以上速くなることはできません。プロパティを削除するには、両方のオブジェクトをループし、削除したいobject.propertyを削除する必要があります。 –

答えて

0

XHR呼び出しから返されたオブジェクトにない元のオブジェクトのプロパティを削除するために、deleteを使用できます。それは単にobject.propertyを削除するだけです。存在するものを判断するために各オブジェクトのプロパティをループする必要がありますが、それはかなり効果的です。

実際には、ループでは、次のような構文があります。delete object [propertyName]は、おそらく行く方法です。

このようなものはかなり近いはずです。 (私はそれをテストしていません)

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]; 
     } 
    }; 
}; 
+0

あなたの返事をありがとう、マイク。あなたは、「存在するものを判断するために各オブジェクトのプロパティをループする必要があるでしょうか」を詳しく説明できますか? –

+0

私は答えを更新しました。それがうまくいかない場合、それは非常に近いはずです。 –

+0

また、angular.copyはあなたのためのトリックを行うかもしれません。最初にターゲットオブジェクトからすべてのプロパティを削除します。パフォーマンスが重要なので、両方のアプローチを試して、より効率的なものを見てみたいかもしれません。 https://docs.angularjs.org/api/ng/function/angular.copy –

関連する問題