2016-05-09 6 views
6

私はselectedItemオブジェクトをAngularに持っていて、他のオブジェクトと配列を含んでいます。JSオブジェクトとその中のすべての配列とオブジェクトをトラバースしてコピーと比較するには?

$scope.editableItem = JSON.parse(JSON.stringify($scope.selectedItem)) 

は、その後、私は入力にeditableItemモデルを使用し、内部にいくつかの値を変更します。私は、JSONのトリックを使用して深いコピーを作成します。 selectedItemは変更されません。その後、変更したすべての変更はPATCHで送信しますが、変更されていないフィールドは送信しません。だから私はselectedItemで同じであるすべてのフィールドからeditableItemを取り除く必要があります。

これを効率的に行うにはどうすればよいですか?私はUnderscoreを使ってオブジェクトを再帰的にトラバースすることを考えていましたが、私がそれに取り組む前にそれが良い考え方であるかどうか本当に知りたいと思います。

また、おそらく、動的に追加された第2のオブジェクトのタッチフィールドのみを含む第3のオブジェクトを作成することもできますが、これにどう対処するかはわかりません。

EDITED: 私は答えが一般的で、最も複雑なオブジェクト構造が可能であると考えています。例えば、this questionからの回答は、オブジェクトが単純なフィールドしか持たないと仮定するか、または角度別のウォッチャーを各フィールドごとに明示的に設定する必要があると仮定して、ここでは適用できません。私はこれがあなたにそこにすべての方法を取得するとは思わない

function getUpdateObject(orig, current) { 
    varChanges = {}; 

    for (var prop in orig) { 
     if (prop.indexOf("$") != 0 && orig[prop] !== current[prop]) { 
      varChanges[prop] = current[prop]; 
     } 
    } 
    return varChanges ; 
}; 

+0

どのように配列の違いを表現したいですか?スパース配列(あなたはJSONに正しく変換できません)? – CherryDT

+0

良い点。私は推測:違いがない場合は、配列を送信しないでください。違いがある場合は、変更されたアレイ全体を送信してください。したがって、配列全体は変更され、渡されるか、変更されず、渡されない値です。 – Senthe

答えて

0

これは私が終わったものです。多分それは誰かを助けるでしょう。私はDeepDiffライブラリを使用しました。コードはCoffeScriptにあり、誰かが必要な場合にJavaScriptに簡単に翻訳できるはずです。

$scope.getChangesObject =() -> 
     selected = $scope.selectedItem 
     editable = $scope.editableItem 
     changes = {} 
     differences = DeepDiff(selected, editable) 

     for diff in differences 
     formattedPath = "" 
     for pathPart, index in diff.path 
      if index isnt diff.path.length - 1 
      formattedPath += pathPart + "." 
      else 
      formattedPath += pathPart 
     changes[formattedPath] = editable[formattedPath] 

     changes 
1

私はこのような機能を持つ似た何かを。オブジェクトにメンバーオブジェクトや配列があるシナリオでは使用しませんが、 "prop"がオブジェクトまたは配列であるかどうかをテストして再帰的に呼び出すことができます。私がこのアプローチに見ている最大の注意点は、深くてネストされた構造を持っている場合、いくつかのレベルが下がるまで変化を検出できないことです。おそらくメモリ内の変更されたプロパティの完全な潜在的な階層を維持しなければならないでしょう、そして、より低いレベルで変更を検出すると、階層全体を出力オブジェクトに書き込みます。

+0

私は3番目のオブジェクトのコピーを作成し、同じフィールドを削除することができます。これは、その場で作成するよりも簡単です。 – Senthe

+0

合理的に聞こえる。しかし、より多くのメモリ集中。 –

+0

'property.indexOf(" $ ")'は何をしますか? – Senthe

関連する問題