JSON

2013-12-18 7 views
9

का उपयोग कर जावास्क्रिप्ट गहरी प्रतिलिपि मुझे जावास्क्रिप्ट ऑब्जेक्ट (सरणी) गहरी प्रतिलिपि में समस्या है। मैंने इससे निपटने के लिए कई अच्छे तरीके पढ़े। और मुझे यह भी पता है कि jQuery के पास इस समस्या के लिए $ .extend API है। लेकिन मेरा सवाल यह है: क्या मैं इस समस्या को हल करने के लिए JSON स्ट्रिंग और पार्स विधि का उपयोग कर सकता हूं?JSON

function deepCopy(oldValue) { 
    var newValue 
    strValue = JSON.stringify(oldValue) 
    return newValue = JSON.parse(strValue) 
} 

var a = { 
    b: 'b', 
    c: [1,2,4], 
    d: null 
} 

copy = deepCopy(a) 

console.log(a === copy) // false 
console.log(a.c === copy.c) // false 

पुनश्च::

यहाँ मेरी कोड है मैं जानता हूं केवल स्थिति मैं जानता हूँ कि अगर कोई सभी वस्तुओं serializable कर रहे हैं, लेकिन यह है कि यह है कि जब वस्तु एक संपत्ति समारोह है जो शामिल हैं। कोई अन्य स्थिति?

मेरी खराब अंग्रेजी को क्षमा करें, और यह अच्छा है अगर आप इसे इंगित कर सकते हैं।

+0

सभी ऑब्जेक्ट JSON के रूप में क्रमबद्ध नहीं हैं। यहां तक ​​कि जो भी हैं, वे उन्हें एक स्ट्रिंग में बदलने के लिए अक्षम हैं और फिर स्ट्रिंग को पार्स करते हैं। लेकिन यह ठीक काम करना चाहिए। केवल समस्या आईई के पुराने संस्करण हैं जहां आपको पॉलीफिल की आवश्यकता है। –

+0

यहां जांचें http://msdn.microsoft.com/en-us/library/ie/cc836466(v=vs.94).aspx – anand4tech

+0

धन्यवाद! मुझे केवल एक वस्तु पता है कि इस ऑब्जेक्ट में ऐसी कोई संपत्ति नहीं है जो एक फ़ंक्शन है। लेकिन अगर दूसरी स्थिति है कि वस्तु क्रमबद्ध नहीं है? – user2666750

उत्तर

23

यदि आपका ऑब्जेक्ट "छोटा" है और इसमें विशेष रूप से क्रमिक गुण हैं, तो JSON क्रमबद्धरण का उपयोग करके एक साधारण गहरी कॉपी हैक ठीक होना चाहिए। लेकिन, यदि आपकी वस्तु बड़ी है, तो आप समस्याओं में भाग ले सकते हैं। और अगर यह unserializable गुण होता है, लापता जाना those'll:

var o = { 
a: 1, 
b: 2, 
sum: function() { return a + b; } 
}; 

var o2 = JSON.parse(JSON.stringify(o)); 
console.log(o2); 

पैदावार:

Object {a: 1, b: 2} 

दिलचस्प बात यह सी # में गहरे प्रतिलिपि समाधान का एक उचित संख्या समान क्रमांकन/deserialization चाल है।

Addendum: सुनिश्चित नहीं है कि आप प्रतिलिपि के बाद वस्तुओं की तुलना करने के मामले में क्या उम्मीद कर रहे हैं। लेकिन, जटिल वस्तुओं के लिए, आपको आमतौर पर सटीक तुलना के लिए अपना खुद का Compare() और/या Equals() विधि लिखना होगा।

यह भी उल्लेखनीय है कि इस प्रकार की प्रति प्रकार की जानकारी को संरक्षित नहीं करती है।

JSON.parse(JSON.stringify(new A())) instanceof A === false 
+1

क्रोम के कंसोल में त्वरित डिबगिंग के लिए यह एक अच्छा समाधान है, क्योंकि Chrome हमेशा ऑब्जेक्ट की अंतिम स्थिति प्रदर्शित करेगा, इसके बजाय कंसोल.लॉग फ़ंक्शन कहलाता था। –

1

आप इसे इस तरह से कर सकते हैं, लेकिन यह ऊपर सूचीबद्ध कारणों में से कुछ के लिए समस्याग्रस्त है:

  1. मैं प्रदर्शन सवाल उठाते हैं।

  2. क्या आपके पास कोई गैर-धारावाहिक गुण है?

  3. और सबसे बड़ा: आपके क्लोन में प्रकार की जानकारी गुम है। आप जो कर रहे हैं उसके आधार पर, यह महत्वपूर्ण हो सकता है। क्या कार्यान्वयनकर्ता आपकी मूल वस्तुओं के प्रोटोटाइप में विधियों को जोड़ता है? वे चले गए हैं मुझे यकीन नहीं है कि आप और क्या खो देंगे।