2013-05-12 2 views
11

jsFiddle here.jquery.extend (true, [], obj) 딥 복사본을 만들지 않음

딥 복사가 작동하면 출력은 "Ender 's Game"이 아니라 "Curious George"가됩니다. 깊은 사본을 만들려면 어떻게해야합니까? this question에 대한 대답은 $.extend(true, [], obj)이 딥 복사본을 생성한다는 것을 나타냅니다. 그러나 나의 예는 그렇지 않다는 것을 보여줍니다.

function Person(){} 
Person.prototype.favorite_books = []; 

var george = new Person(); 
george.favorite_books = ["Curious George"]; 

var kate = new Person(); 
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"]; 

var people = [kate, george]; 

var people_copy = $.extend(true, [], people); 
people_copy[0].favorite_books[0] = "Ender's Game"; 

$('#text').text(people[0].favorite_books[0]); 

나는 jsFiddle 업데이트

솔루션. 개체가 사용자 지정 개체 인 경우 배열의 각 개체를 개별적으로 으로 완전히 복사해야합니다 (즉, $.isPlainObject이 false를 반환 함).

+0

사용 .clone()를 참조 http://api.jquery.com/clone/ –

+6

@ 폴 설리반'.clone는()'DOM 개체와 – zerkms

+0

좋아 너무 .extend 검색 소스 코드를 사용하고 이유를 볼 수있다 재귀 함수는 속성을 복사하지 않습니다 –

답변

17

그리고는 실제 답변입니다 일반 JavaScript 객체, 사용자 정의 객체를 사용하는 동안. jQuery는 새로운 사용자 정의 객체를 정확히 인스턴스화하는 방법을 알 수 없기 때문에 분명합니다. 그래서이 예상대로 작동 : JQuery와 코드

var george = {}; 
george.favorite_books = ["Curious George"]; 

var kate = {}; 
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"]; 

var people = [kate, george]; 

var people_copy = $.extend(true, [], people); 

console.log(people_copy[0].favorite_books == people[0].favorite_books); 

참조 : https://github.com/jquery/jquery/blob/master/src/core.js#L305

그것이 jQuery.isPlainObject(copy)있어하거나 배열의 경우는 검사 것을 알 수있다. 그렇지 않으면 참조 사본 만 수행합니다.

+0

@Rose Perrone : 깊은 사본을 만들었 기 때문에. 따라서 원본 개체는 그대로 유지되며 수정 된 개체는 독립적으로 수정됩니다. 당신을 혼란스럽게하는 것은 확실하지 않습니다. – zerkms

+0

@RoyiNamir 당신은 딥 복사 (첫 번째 인자)가되도록 지정했다. – zerkms

+0

'$ .extend' 함수 호출의 첫번째 부울 인수가 무엇인지 확인하십시오. 그래도 여전히 명확하지 않은지 다른 질문을하십시오. – zerkms

2

흥미 롭습니다 .... 깊은 곳으로 복사하는 것처럼 보이지 않습니다.

각 개체를 개별적으로 완전 복사해야합니다.

var people_copy = []; 
$.each(people,function(i,obj) { 
    people_copy.push($.extend(true,{},obj)); 
}); 

편집 : 확실히는 영업 이익의 바이올린의 포크 볼 :

순간 jQuery를 할 수있는 유일한 클론에서 : 지금 여기

http://jsfiddle.net/s2bLv/4/

+0

'개체를 사용 중이며 배열이 아닙니다. --- 그 어떤 증거입니까? 배열이 특별한 종류의 객체가 아닌가? – zerkms

+0

https://github.com/jquery/jquery/blob/master/src/core.js # L305 - 배열을 처리해야합니다 – zerkms

+0

각 개체를 개별적으로 개별적으로 복사해야하는 경우 일반 솔루션이 아닌 OP의 간단한 테스트 케이스 만 다루지 않는 한 모든 재귀 코드가 필요합니다. – nnnnnn

7

이것은 내가 많은 방법을 시도한 후 그것을 한 적이 어떻게이 새로운 전체 복사본이 아닌 얕은 복사본을 생성합니다

var newArray = JSON.parse(JSON.stringify(orgArray)); 

.

또한 분명히 이벤트와 함수를 복제하지 않지만 좋은 점은 한 줄로 처리 할 수 ​​있으며 개체의 모든 왕 (배열, 문자열, 숫자, 객체 등)에 사용할 수 있다는 것입니다.

+2

날짜 개체에는 작동하지 않습니다. –

관련 문제