Tôi có hai đối tượng: oldObj
và newObj
.
Dữ liệu trong oldObj
được sử dụng để điền vào biểu mẫu và newObj
là kết quả của việc người dùng thay đổi dữ liệu trong biểu mẫu này và gửi nó.
Cả hai đối tượng đều sâu, tức là. chúng có các thuộc tính là các đối tượng hoặc mảng của các đối tượng, v.v. - chúng có thể sâu n cấp, do đó thuật toán diff cần phải được đệ quy.
Bây giờ tôi cần không chỉ là tìm ra những gì đã thay đổi (như trong thêm / cập nhật / xóa) từ oldObj
đến newObj
, mà còn làm thế nào để tốt nhất đại diện cho nó.
Cho đến nay, suy nghĩ của tôi là chỉ xây dựng một genericDeepDiffBetweenObjects
phương thức sẽ trả về một đối tượng trên biểu mẫu {add:{...},upd:{...},del:{...}}
nhưng sau đó tôi nghĩ: ai đó phải có điều này trước đây.
Vậy ... có ai biết về một thư viện hoặc một đoạn mã sẽ làm điều này và có thể có cách thể hiện sự khác biệt thậm chí tốt hơn (theo cách vẫn là tuần tự hóa JSON)?
Cập nhật:
Tôi đã nghĩ ra một cách tốt hơn để biểu diễn dữ liệu được cập nhật, bằng cách sử dụng cùng cấu trúc đối tượng như newObj
, nhưng biến tất cả các giá trị thuộc tính thành các đối tượng trên biểu mẫu:
{type: '<update|create|delete>', data: <propertyValue>}
Vì vậy, nếu newObj.prop1 = 'new value'
và oldObj.prop1 = 'old value'
nó sẽ thiết lậpreturnObj.prop1 = {type: 'update', data: 'new value'}
Cập nhật 2:
Nó thực sự có lông khi chúng ta có các thuộc tính là mảng, vì mảng [1,2,3]
phải được tính bằng [2,3,1]
, đủ đơn giản cho các mảng của các loại dựa trên giá trị như chuỗi, int & bool, nhưng thực sự khó xử lý khi nói đến mảng các kiểu tham chiếu như đối tượng và mảng.
Các mảng ví dụ cần được tìm thấy bằng nhau:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Không chỉ khá phức tạp để kiểm tra loại bình đẳng giá trị sâu này, mà còn tìm ra một cách tốt để thể hiện những thay đổi có thể xảy ra.
newObj
được tạo bởi các giá trị đọc mã js từ một biểu mẫu trong DOM. Có một số cách để giữ trạng thái và thực hiện việc này dễ dàng hơn nhiều, nhưng tôi muốn giữ trạng thái không trạng thái như một bài tập. Ngoài ra tôi đang tìm kiếm nghệ thuật trước để xem những người khác có thể đã giải quyết điều này như thế nào, nếu thực sự có ai đó.