2013-08-21 3 views
129

मैंने एक त्वरित jsfiddle here लिखा, जहां मैं एक छोटे से जेसन ऑब्जेक्ट को एक नए चर में पास करता हूं और मूल चर (डेटा को नया चर नहीं) से डेटा संशोधित करता हूं, लेकिन नए चर के डेटा को भी अपडेट किया जाता है। इसका मतलब यह होना चाहिए कि जेसन ऑब्जेक्ट संदर्भ द्वारा पारित किया गया था, है ना?जावास्क्रिप्ट ऑब्जेक्ट को नए चर पर प्रतिलिपि कैसे संदर्भित करें?

var json_original = {one:'one', two:'two'} 

var json_new = json_original; 

console.log(json_original); //one, two 
console.log(json_new); //one, two 

json_original.one = 'two'; 
json_original.two = 'one'; 

console.log(json_original); //two, one 
console.log(json_new); //two, one 

है वहाँ इतना है कि मूल चर संशोधित नया वेरिएबल में बदलाव नहीं करेगी एक json वस्तु की एक गहरी प्रतिलिपि बनाने के लिए एक तरह से:

यहाँ मेरी त्वरित कोड है?

+22

वहां कोई JSON नहीं है। JSON के साथ जावास्क्रिप्ट ऑब्जेक्ट्स को भ्रमित न करें। – Quentin

+0

@ क्वांटिन, धन्यवाद, मैं जवाक्रिप्ट ऑब्जेक्ट्स और जेसन (रेफरी: http://stackoverflow.com/questions/6489783/whats-the-difference-between-javascript-object-and-json-object के बीच अंतर पर पढ़ूंगा) – Prusprus

+0

ऐसा नहीं लगता कि यह एक डुप्लिकेट है, उत्तर अन्य धागे पर नहीं मिला था। – Prusprus

उत्तर

194

मुझे पता चला है कि यदि आप jQuery का उपयोग नहीं कर रहे हैं और केवल सरल वस्तुओं (टिप्पणियां देखें) क्लोनिंग में रुचि रखते हैं तो निम्न कार्य करता है।

JSON.parse(JSON.stringify(json_original)); 
+14

फ़ंक्शंस के लिए काम नहीं करता है, केवल ऑब्जेक्ट के भीतर गुण (चर) । – Harold

+5

'JSON.stringify ({key: अपरिभाषित}) // =>" {} "' –

+0

यह 'jQuery.extend' महान तकनीक का उपयोग कर मुद्दों के बाद मेरे लिए आश्चर्यजनक काम करता है। – Kiee

89

आपका एकमात्र विकल्प किसी भी तरह से वस्तु को क्लोन करना है।

this stackoverflow question देखें कि आप इसे कैसे प्राप्त कर सकते हैं।

सरल JSON ऑब्जेक्ट के लिए, सबसे आसान तरीका होगा:

var newObject = JSON.parse(JSON.stringify(oldObject)); 

अगर आप jQuery का उपयोग करें, आप का उपयोग कर सकते हैं:

// Shallow copy 
var newObject = jQuery.extend({}, oldObject); 

// Deep copy 
var newObject = jQuery.extend(true, {}, oldObject); 

अद्यतन 2017: मैं उल्लेख करना चाहिए, क्योंकि यह एक लोकप्रिय है उत्तर दें, जावास्क्रिप्ट के नए संस्करणों का उपयोग करके इसे हासिल करने के बेहतर तरीके हैं:

ईएस 6 या टाइपस्क्रिप्ट (2.1+) में:

var shallowCopy = { ...oldObject }; 

var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" }; 

ध्यान दें कि यदि "extraProp" भी oldObject पर एक संपत्ति है, अपने मूल्य क्योंकि extraProp उपयोग नहीं किया जाएगा: "abc" अभिव्यक्ति है, जो अनिवार्य रूप से यह ओवरराइड करता है में बाद में निर्दिष्ट किया जाता है। बेशक, oldObject संशोधित नहीं किया जाएगा।

संबंधित मुद्दे