У мене два об’єкти: 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]
, що досить просто для масивів типів на основі значень, таких як string, int & bool, але стає важко обробляти, коли справа доходить до масиви посилальних типів, як об'єкти та масиви.
Приклад масивів, які слід знайти рівними:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Це не тільки досить складно перевірити наявність цього виду глибокої рівності цінностей, але й розробити хороший спосіб представити зміни, які можуть бути.
newObj
формується значеннями зчитування коду js з форми в DOM. Є кілька способів зберегти державу і зробити це набагато простіше, але я хотів би тримати це без громадянства як вправу. Крім того, я шукаю попереднього рівня техніки, щоб побачити, як інші, можливо, вирішили це, якщо справді хтось має.