Saya memiliki dua objek: oldObj
dan newObj
.
Data di oldObj
digunakan untuk mengisi formulir dan newObj
merupakan hasil dari pengguna mengubah data dalam formulir ini dan mengirimkannya.
Kedua objek dalam, yaitu. mereka memiliki properti yang merupakan objek atau array objek dll - mereka dapat n level dalam, sehingga algoritma diff harus bersifat rekursif.
Sekarang saya tidak hanya perlu mencari tahu apa yang diubah (seperti pada tambah / perbarui / dihapus) dari oldObj
ke newObj
, tetapi juga bagaimana cara terbaik untuk mewakilinya.
Sejauh ini pikiranku adalah untuk hanya membangun genericDeepDiffBetweenObjects
metode yang akan mengembalikan objek pada formulir {add:{...},upd:{...},del:{...}}
tetapi kemudian aku berpikir: orang lain pasti membutuhkan ini sebelumnya.
Jadi ... apakah ada yang tahu perpustakaan atau sepotong kode yang akan melakukan ini dan mungkin memiliki cara yang lebih baik untuk mewakili perbedaan (dengan cara yang masih berseri JSON)?
Memperbarui:
Saya telah memikirkan cara yang lebih baik untuk mewakili data yang diperbarui, dengan menggunakan struktur objek yang sama dengan newObj
, tetapi mengubah semua nilai properti menjadi objek pada formulir:
{type: '<update|create|delete>', data: <propertyValue>}
Jadi jika newObj.prop1 = 'new value'
dan oldObj.prop1 = 'old value'
itu akan diaturreturnObj.prop1 = {type: 'update', data: 'new value'}
Pembaruan 2:
Itu menjadi benar-benar berbulu ketika kita sampai ke properti yang array, karena array [1,2,3]
harus dihitung sama dengan [2,3,1]
, yang cukup sederhana untuk array tipe nilai berbasis seperti string, int & bool, tetapi menjadi sangat sulit untuk ditangani ketika datang ke array tipe referensi seperti objek dan array.
Contoh array yang harus ditemukan sama:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Tidak hanya cukup rumit untuk memeriksa jenis kesetaraan nilai yang dalam ini, tetapi juga untuk mencari cara yang baik untuk mewakili perubahan yang mungkin terjadi.
newObj
dihasilkan oleh nilai membaca kode js dari formulir di DOM. Ada beberapa cara untuk menjaga keadaan dan melakukan ini lebih mudah, tetapi saya ingin menjadikannya tanpa kewarganegaraan sebagai latihan. Saya juga mencari seni sebelumnya untuk melihat bagaimana orang lain mungkin menangani ini, jika memang ada yang punya.