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