Mam dwa przedmioty: oldObji newObj.
Dane oldObjzostały użyte do wypełnienia formularza i newObjsą 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 oldObjdo newObj, ale także jak najlepiej to przedstawić.
Do tej pory myślałem o zbudowaniu genericDeepDiffBetweenObjectsmetody, 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.
newObjjest 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ł.