との2つのオブジェクトがoldObj
ありnewObj
ます。
のデータはoldObj
フォームへの入力に使用されnewObj
、ユーザーがこのフォームのデータを変更して送信した結果です。
つまり、両方のオブジェクトは深いです。それらはオブジェクトやオブジェクトの配列などのプロパティを持っています-それらはnレベルの深さを持つことができるので、diffアルゴリズムは再帰的である必要があります。
今、私はちょうどから(追加のように/更新/削除)変更されたかを把握する必要がないoldObj
のnewObj
が、また最高にそれを表現する方法。
これまでのところ、genericDeepDiffBetweenObjects
フォーム上のオブジェクトを返すメソッドを作成することだけが私の考えでした{add:{...},upd:{...},del:{...}}
が、次に、誰かがこれを以前に必要としていたに違いないと考えました。
それで...これを行うライブラリまたはコードの一部を知っていて、おそらく違いを表すより良い方法があります(まだJSONシリアル化可能な方法で)?
更新:
と同じオブジェクト構造を使用して、newObj
すべてのプロパティ値をフォーム上のオブジェクトに変換することにより、更新されたデータを表すより良い方法を考えました。
{type: '<update|create|delete>', data: <propertyValue>}
だからnewObj.prop1 = 'new value'
、oldObj.prop1 = 'old value'
それが設定されるとreturnObj.prop1 = {type: 'update', data: 'new value'}
アップデート2:
配列であるプロパティに到達する[1,2,3]
と[2,3,1]
、それは本当に毛むくじゃらになります。配列はに等しいと数えられる必要があるためです。これは、文字列、int、boolなどの値ベースの型の配列では十分簡単ですが、オブジェクトや配列などの参照型の配列。
等しいはずの配列の例:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
このタイプの深い値の等価性をチェックすることは非常に複雑であるだけでなく、変更の可能性を表す良い方法を理解することも必要です。
newObj
DOMのフォームから値を読み取るjsコードによって生成されます。状態を保持し、これをはるかに簡単に行う方法はいくつかありますが、演習として状態を保持しないようにしたいと思います。また、実際に誰かがこれに取り組んでいる場合、他の人がこれにどのように取り組んできたかを確認するために、先行技術を探しています。