Dưới đây là một ví dụ về cấu trúc dữ liệu với các tham chiếu theo chu kỳ:
function makeToolshed(){
var nut = {name: 'nut'}, bolt = {name: 'bolt'};
nut.needs = bolt; bolt.needs = nut;
return { nut: nut, bolt: bolt };
}
Khi bạn muốn GIỮ các tài liệu tham khảo theo chu kỳ (khôi phục chúng khi bạn giải tuần tự hóa, thay vì "gỡ bỏ" chúng), bạn có 2 lựa chọn, tôi sẽ so sánh ở đây. Đầu tiên là Douglas Crockford cycle.js , thứ hai là tôi Siberia gói. Cả hai đều hoạt động bằng cách đầu tiên "giải mã" đối tượng, tức là xây dựng một đối tượng khác (không có bất kỳ tham chiếu theo chu kỳ nào) "chứa cùng một thông tin."
Ông Crockford đi trước:
JSON.decycle(makeToolshed())
Như bạn thấy, cấu trúc lồng nhau của JSON được giữ lại, nhưng có một điều mới, đó là các đối tượng có thuộc tính đặc biệt $ref
. Hãy xem cách nó hoạt động.
root = makeToolshed();
[root.bolt === root.nut.needs, root.nut.needs.needs === root.nut]; // retutrns [true,true]
Ký hiệu đô la là viết tắt của gốc. .bolt
có $ref
cho chúng tôi biết đó .bolt
là một đối tượng "đã thấy" và giá trị của thuộc tính đặc biệt đó (ở đây, chuỗi $ ["nut"] ["nhu cầu"]) cho chúng tôi biết, xem ===
ở trên. Tương tự như vậy cho thứ hai $ref
và thứ hai ===
ở trên.
Chúng ta hãy sử dụng một bài kiểm tra công bằng sâu phù hợp (cụ thể là deepGraphEqual
chức năng của Anders Kaseorg từ câu trả lời được chấp nhận cho câu hỏi này ) để xem liệu nhân bản có hoạt động không.
root = makeToolshed();
clone = JSON.retrocycle(JSON.decycle(root));
deepGraphEqual(root, clone) // true
serialized = JSON.stringify(JSON.decycle(root));
clone2 = JSON.retrocycle(JSON.parse(serialized));
deepGraphEqual(root, clone2); // true
Bây giờ, siberia:
JSON.Siberia.forestify(makeToolshed())
Siberia không cố bắt chước JSON "cổ điển", không có cấu trúc lồng nhau. Biểu đồ đối tượng được mô tả theo cách "phẳng". Mỗi nút của biểu đồ đối tượng được biến thành một cây phẳng (danh sách cặp giá trị khóa đơn giản với các giá trị chỉ nguyên), là một mục trong .forest.
Tại chỉ số 0, chúng tôi tìm thấy đối tượng gốc, ở các chỉ số cao hơn, chúng tôi tìm thấy các nút khác của biểu đồ đối tượng và các giá trị âm (của một số khóa của một số cây trong rừng) trỏ đến atoms
mảng, (được gõ thông qua mảng loại, nhưng chúng ta sẽ bỏ qua chi tiết gõ ở đây). Tất cả các nút đầu cuối đều nằm trong bảng nguyên tử, tất cả các nút không đầu cuối đều nằm trong bảng rừng và bạn có thể thấy ngay có bao nhiêu nút mà biểu đồ đối tượng có, cụ thể là forest.length
. Hãy kiểm tra nếu nó hoạt động:
root = makeToolshed();
clone = JSON.Siberia.unforestify(JSON.Siberia.forestify(root));
deepGraphEqual(root, clone); // true
serialized = JSON.Siberia.stringify(JSON.Siberia.forestify(root));
clone2 = JSON.Siberia.unforestify(JSON.Siberia.unstringify(serialized));
deepGraphEqual(root, clone2); // true
so sánh
sẽ thêm phần sau.