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