2014-02-18 15 views
15

상황

나는 중첩 된 객체와 객체의 배열을 복제하려고합니다. 같은Lodash의 .clone 및 .cloneDeep 행동

뭔가 다음 _.clone 방법과 isDeep 매개 변수와

var data = [ 
    { id: 1, values: { a: 'a', b: 'b' } }, 
    { id: 2, values: { c: 'c', d: 'd' } } 
]; 

_.Clone

true에서 :

If isDeep is true nested objects will also be cloned, otherwise they will be assigned by reference.

:

var clone = _.clone(data, true); 

data[1].values.d = 'x'; 

console.log(_.isEqual(data, clone)); // true, clone[1].values.d == 'x' 

나는 clone[1].values.d == 'd' 예상

무엇이 잘못 되었나요? 또한

나는 _.cloneDeep 방법으로 시도 할 때

_.CloneDeep, 나는 오류 얻을 :

var clone = _.cloneDeep(data); 

// Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)} 
// has no method 'cloneDeep' 

왜이 오류?

는 복제가 더 예상대로 원래의 객체에 대한 참조가 없습니다

$.extend으로 $ .extend : 거친 토끼와 루이스 '의견에

var clone = $.extend(true, {}, data); 

console.log(_.isEqual(data, clone)); // false, clone[1].values.d == 'd' 
+6

복제 버전의 lodash 버전을 사용하고 있으며 밑줄 버전을 사용하지 않았습니까? 처음에 lodash.js를 추가하고 underscore.js를 추가하면 설명하는 것과 동일한 동작을 얻습니다. –

+2

질문에 코드를 사용하고 로다시를 '_'에 할당하면 질문에 명시된 문제를 재현 할 수 없습니다. (즉, 'isDeep'을'true '로 설정 한'_.clone'은 예상대로 작동합니다.) Gruff Bunny의 가설은 좋은 것입니다. 나는 밑줄에 대한 정확한 드롭 인 대체로서 lodash를 사용하는 방법이 있다고 믿습니다 .js. 밑줄을 그어서 사용하지 않기 때문에 lodash를 사용하는 것이 좋을 것 같습니다 .js는 그렇게하지 않습니다. – Louis

답변

12

감사합니다, 나는 문제의 원인을 발견했다.

Backbone.js도 사용하기 때문에 일부 기능을 사용할 수 없게하는 백본 및 언더 코어와 호환되는 특수 빌드를로드했습니다.

var clone = _.clone(data, true); 

data[1].values.d = 'x'; 

난 그냥 밑줄 내 백본 응용 프로그램에서 정상 빌드 구축하고 응용 프로그램이 여전히 작동하고 교체했다. 이제 Lodash .clone을 예상 된 동작과 함께 사용할 수 있습니다.

편집 2018 : 언더 코어 빌드 doesn't seem to exist anymore. 2018 년에이 책을 읽는다면 this documentation (백본 및 로다시)에 관심을 가질 수 있습니다.