У меня есть два объекта: 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]]
Не только довольно сложно проверить этот тип глубокого равенства, но и найти хороший способ представить возможные изменения.