İki nesnem var: oldObj
ve newObj
.
İçindeki veriler oldObj
bir formu doldurmak için kullanıldı newObj
ve kullanıcının bu formdaki verileri değiştirip göndermesinin sonucudur.
Her iki nesne de derin, yani. nesneler veya nesnelerin dizisi gibi özelliklere sahiptirler - n seviyesi derin olabilirler, bu nedenle fark algoritmasının özyinelemeli olması gerekir.
Şimdi sadece dan (ilave olarak / güncellenen / silinmiş) değiştirildi anlamaya değil gerek oldObj
için newObj
değil, aynı zamanda en iyi şekilde bunu temsil nasıl.
Şimdiye kadar düşüncelerim sadece genericDeepDiffBetweenObjects
formdaki bir nesneyi döndürecek bir yöntem oluşturmaktı, {add:{...},upd:{...},del:{...}}
ama sonra düşündüm: daha önce başka birine ihtiyaç duymuş olmalı.
Yani ... Herkes bunu yapacak bir kütüphane veya bir kod parçası biliyor ve belki de farkı temsil etmek için daha iyi bir yolu var (hala JSON serileştirilebilir bir şekilde)?
Güncelleme:
Güncellenmiş verileri temsil etmek için daha iyi bir yol, aynı nesne yapısını kullanarak newObj
, ancak tüm özellik değerleri formdaki nesnelere çevirerek düşündüm :
{type: '<update|create|delete>', data: <propertyValue>}
Yani eğer newObj.prop1 = 'new value'
ve oldObj.prop1 = 'old value'
o kuracakreturnObj.prop1 = {type: 'update', data: 'new value'}
Güncelleme 2:
Dizi [1,2,3]
eşit özelliklere sahip olduğumuzda gerçekten kıllı olur, çünkü dizi eşit olarak sayılmalıdır [2,3,1]
, dize, int & bool gibi değer tabanlı türlerden oluşan diziler için yeterince basittir, ancak söz konusu olduğunda işlenmesi gerçekten zorlaşır nesneler ve diziler gibi referans türlerinin dizileri.
Eşit bulunması gereken örnek diziler:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Sadece bu tip derin değer eşitliğini kontrol etmek değil, aynı zamanda olabilecek değişiklikleri temsil etmek için iyi bir yol bulmak da oldukça karmaşıktır.
newObj
bir formdaki js kodu okuma değerleri tarafından oluşturulur. Durumu korumanın ve bunu çok daha kolay hale getirmenin birkaç yolu var, ama bunu bir egzersiz olarak vatansız tutmak istiyorum. Ayrıca, eğer gerçekten kimse varsa, başkalarının bununla nasıl başa çıkabileceğini görmek için önceki sanatı arıyorum.