У меня есть два объекта: oldObjи newObj.
Данные в oldObjбыли использованы для заполнения формы и newObjявляются результатом того, что пользователь изменил данные в этой форме и отправил ее.
Оба объекта глубокие, т.е. у них есть свойства, которые являются объектами или массивами объектов и т. д. - они могут иметь глубину n уровней, поэтому алгоритм diff должен быть рекурсивным.
Теперь мне нужно не только выяснить, что было изменено (как добавлено / обновлено / удалено) из oldObjto 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. Есть несколько способов сохранить состояние и сделать это намного проще, но я бы хотел оставить его без сохранения состояния в качестве упражнения. Также я ищу предшествующий уровень техники, чтобы увидеть, как другие могли бы справиться с этим, если действительно кто-то есть.