Mam dwa przedmioty: oldObj
i newObj
.
Dane oldObj
zostały użyte do wypełnienia formularza i newObj
są wynikiem zmiany danych użytkownika w tym formularzu i przesłania go.
Oba obiekty są głębokie, tj. mają właściwości, które są obiektami lub tablicami obiektów itp. - mogą mieć głębokość n poziomów, dlatego algorytm różnicy musi być rekurencyjny.
Teraz muszę nie tylko dowiedzieć się, co zostało zmienione (jak dodano / zaktualizowano / usunąć) od oldObj
do newObj
, ale także jak najlepiej to przedstawić.
Do tej pory myślałem o zbudowaniu genericDeepDiffBetweenObjects
metody, która zwróciłaby obiekt na formularzu, {add:{...},upd:{...},del:{...}}
ale potem pomyślałem: ktoś inny musiał tego wcześniej potrzebować.
Więc ... czy ktoś wie o bibliotece lub fragmencie kodu, który to zrobi i może ma jeszcze lepszy sposób reprezentowania różnicy (w sposób, który nadal jest możliwy do serializacji przez JSON)?
Aktualizacja:
Pomyślałem o lepszym sposobie reprezentacji zaktualizowanych danych, używając tej samej struktury obiektu newObj
, ale przekształcając wszystkie wartości właściwości w obiekty w formularzu:
{type: '<update|create|delete>', data: <propertyValue>}
Więc jeśli newObj.prop1 = 'new value'
i oldObj.prop1 = 'old value'
to się ustawireturnObj.prop1 = {type: 'update', data: 'new value'}
Aktualizacja 2:
Robi się naprawdę owłosiony, gdy dochodzimy do właściwości, które są tablicami, ponieważ tablica [1,2,3]
powinna być liczona jako równa [2,3,1]
, co jest dość proste dla tablic typów opartych na wartościach, takich jak string, int & bool, ale naprawdę trudno jest sobie z tym poradzić, jeśli chodzi o tablice typów referencyjnych, takich jak obiekty i tablice.
Przykładowe tablice, które należy uznać za równe:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Sprawdzenie tego rodzaju głębokiej równości wartości jest nie tylko dość skomplikowane, ale również wymyślenie dobrego sposobu przedstawienia potencjalnych zmian.
newObj
jest generowany przez odczyt kodu js z formularza w DOM. Istnieje kilka sposobów, aby utrzymać stan i zrobić to o wiele łatwiej, ale chciałbym, aby ćwiczenie to było bezstanowe. Szukam również stanu techniki, aby zobaczyć, jak inni mogliby rozwiązać ten problem, jeśli w rzeczywistości ktokolwiek to zrobił.