2015-02-12 12 views
16

में किसी अन्य सरणी में ऑब्जेक्ट्स की सरणी की प्रतिलिपि बनाना स्लाइस (0) और concat() का उपयोग करके जावास्क्रिप्ट में किसी अन्य सरणी में ऑब्जेक्ट्स की सरणी की प्रतिलिपि बनाना काम नहीं करता है।जावास्क्रिप्ट (डीप कॉपी)

मैंने परीक्षण करने के लिए निम्नलिखित प्रयास किए हैं यदि मुझे इसका उपयोग करके गहरी प्रतिलिपि के अपेक्षित व्यवहार मिलते हैं। लेकिन कॉपी किए गए सरणी में परिवर्तन करने के बाद मूल सरणी भी संशोधित हो रही है।

var tags = []; 
for(var i=0; i<3; i++) { 
    tags.push({ 
     sortOrder: i, 
     type: 'miss' 
    }) 
} 
for(var tag in tags) { 
    if(tags[tag].sortOrder == 1) { 
     tags[tag].type = 'done' 
    } 
} 
console.dir(tags) 

var copy = tags.slice(0) 
console.dir(copy) 

copy[0].type = 'test' 
console.dir(tags) 

var another = tags.concat() 
another[0].type = 'miss' 
console.dir(tags) 

कैसे मैं दूसरे में एक सरणी की एक गहरी प्रतिलिपि कर सकते हैं, ताकि मूल सरणी अगर मैं प्रति सरणी में परिवर्तन करने के संशोधित नहीं है।

+0

मुझे यकीन है कि तुम क्या करने की कोशिश कर रहा है, लेकिन कर रहे हैं नहीं कर रहा हूँ सही कोड angular.copy पाया। मैं सुझाव देता हूं कि लूप के लिए अपना दूसरा लूप 'टैग के विभिन्न टैग) के लिए बदलना {{टैग)।sortOrder == 1) { tag.type == 'done' }} ' –

+0

आपके पर्यावरण के आधार पर, आप ऑब्जेक्ट.क्रेट का प्रयास कर सकते हैं? – Zlatko

+0

@zlatko क्या आप उसी – jsbisht

उत्तर

63

var copy = JSON.parse(JSON.stringify(tags)); 
+1

मैं अब इसका उपयोग कर रहा हूं। यह पूरी तरह से काम करता है। – jsbisht

+0

एक हज़ार साल से अधिक, और अभी भी सहायक! –

+0

मुझे नहीं पता कि यह – Aerious

14

प्रयास करें निम्नलिखित

// Deep copy 
var newArray = jQuery.extend(true, [], oldArray); 

अधिक जानकारी के लिए प्रयास करें इस सवाल की जांच बाहर What is the most efficient way to deep clone an object in JavaScript?

+0

यह काम नहीं करता है क्योंकि परिणाम एक वस्तु है, एक सरणी नहीं है। –

4

जैसा कि बताया जा Here.slice(0) आदिम प्रकार के साथ सरणी क्लोनिंग में प्रभावी हो जाएगा तत्वों। हालांकि आपके उदाहरण में tags सरणी में अज्ञात वस्तुएं हैं। इसलिए क्लोन सरणी में इन वस्तुओं में कोई भी परिवर्तन tags सरणी में दिखाई देता है।

@ इन तत्वों की वस्तुओं को अपमानित करने और नए बनाने के ऊपर @ खतरे का उत्तर @

Here is another thread ऐसी ही स्थिति

-1

को संबोधित कर रहे इसके लिए मैं नए ECMAScript का उपयोग 6 Object.assign विधि:

let oldObject = [1,3,5,"test"]; 
let newObject = Object.assign({}, oldObject) 

इस विधि का पहला तर्क सरणी अद्यतन किया जाना है, हम एक खाली पारित ऑब्जेक्ट क्योंकि हम एक पूरी तरह से नई वस्तु चाहते हैं,

भी आप कॉपी करने के लिए अन्य ऑब्जेक्ट भी जोड़ सकते हैं:

let newObject = Object.assign({}, oldObject, o2, o3, ...) 
+0

ऑब्जेक्ट.साइन के साथ भी आपके पास एक ही समस्या है, जावास्क्रिप्ट में अभी मौजूद प्रत्येक विधि प्राइमेटिव्स के साथ ठीक है, अगर आपके पास ऑब्जेक्ट की अन्य ऑब्जेक्ट्स के साथ ऑब्जेक्ट है, तो संदर्भों को रखा जाएगा – darkyndy

0

सबसे आसान और अंडरस्कोर/Lodash उपयोग कर रहा है एक ही पंक्ति में ऐसा करने का आशावादी तरीका

let a = _.map(b, _.clone)

0

एक ही मुद्दा मेरा क्या। मेरे पास सेवा से डेटा है और दूसरे चर में सहेजा गया है। जब भी मैं अपने सरणी को अद्यतन करता हूं तो प्रतिलिपि बनाई गई सरणी भी अपडेट की जाती है। पुराने कोड की तरह

नीचे

//$scope.MyData get from service 
 
$scope.MyDataOriginal = $scope.MyData;

तो जब कभी मैं $ बदलने scope.MyData भी $ scope.MyDataOriginal बदल रहा है। मैं एक समाधान है कि के रूप में

नीचे

$scope.MyDataOriginal = angular.copy($scope.MyData);

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