यहाँ चक्रीय संदर्भों के साथ डेटा संरचना का एक उदाहरण दिया गया है:
function makeToolshed(){
var nut = {name: 'nut'}, bolt = {name: 'bolt'};
nut.needs = bolt; bolt.needs = nut;
return { nut: nut, bolt: bolt };
}
जब आप चक्रीय संदर्भों को KEEP करना चाहते हैं (जब आप उन्हें डिस्क्राइब करते हैं ("nuking" के बजाय उन्हें पुनर्स्थापित करें), तो आपके पास 2 विकल्प हैं, जिनकी मैं यहाँ तुलना करूँगा। पहला है डगलस क्रॉफोर्ड का चक्र । दूसरा, मेरा साइबेरिया पैकेज है। दोनों पहले "डिक्रिप्शन" ऑब्जेक्ट द्वारा काम करते हैं, अर्थात, किसी अन्य ऑब्जेक्ट का निर्माण (बिना किसी चक्रीय संदर्भ के) "एक ही जानकारी युक्त"।
मिस्टर क्रॉकफोर्ड पहले जाता है:
JSON.decycle(makeToolshed())
जैसा कि आप देखते हैं, JSON की नेस्टेड संरचना को बरकरार रखा गया है, लेकिन एक नई चीज है, जो विशेष $ref
संपत्ति वाली वस्तुएं हैं। आइए देखें कि यह कैसे काम करता है।
root = makeToolshed();
[root.bolt === root.nut.needs, root.nut.needs.needs === root.nut]; // retutrns [true,true]
डॉलर का संकेत जड़ के लिए खड़ा है। .bolt
होने $ref
हमें बताता है कि .bolt
एक "पहले से ही देखा" वस्तु है, और कहा कि विशेष संपत्ति का मूल्य (यहाँ, स्ट्रिंग $ [ "अखरोट"] [ "की जरूरत है"]) हमें जहां, पहले देखने के लिए कहता है ===
ऊपर। इसी तरह दूसरा $ref
और ===
ऊपर दूसरा ।
यदि क्लोनिंग काम करती है तो यह देखने के लिए एक उपयुक्त गहरी समानता परीक्षण (अर्थात इस प्रश्न केdeepGraphEqual
स्वीकृत उत्तर से एंडर्स कसेग के कार्य ) का उपयोग करें।
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
अब, साइबेरिया:
JSON.Siberia.forestify(makeToolshed())
साइबेरिया "क्लासिक" JSON की नकल करने की कोशिश नहीं करता है, कोई नेस्टेड संरचना नहीं है। ऑब्जेक्ट ग्राफ को "सपाट" तरीके से वर्णित किया गया है। ऑब्जेक्ट ग्राफ के प्रत्येक नोड को एक फ्लैट ट्री (पूर्णांक-केवल मानों के साथ सादे कुंजी मूल्य जोड़ी) में बदल दिया जाता है, जो .forest.
एट इंडेक्स में एक प्रविष्टि है, हम रूट ऑब्जेक्ट को उच्च सूचकांकों में पाते हैं, हम अन्य नोड्स को खोजते हैं ऑब्जेक्ट ग्राफ, और नकारात्मक मान (जंगल के कुछ पेड़ की कुछ कुंजी) atoms
सरणी को इंगित करते हैं , (जो प्रकार सरणी के माध्यम से टाइप किया जाता है, लेकिन हम यहां टाइपिंग विवरण छोड़ देंगे)। सभी टर्मिनल नोड्स परमाणु तालिका में हैं, सभी गैर-टर्मिनल नोड्स वन तालिका में हैं, और आप तुरंत देख सकते हैं कि ऑब्जेक्ट ग्राफ में कितने नोड हैं, अर्थात् forest.length
। चलो परीक्षण अगर यह काम करता है:
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
तुलना
बाद में अनुभाग जोड़ देगा।