비 재 귀적 깊이 복사
// ,
/**
* ,
* ,
* 1.
*
* 2. . key value
* currentCopyElement[key] = {};
* , , ,
*
* srcVisitedQueue ( ) ,
* , , copyVisitedQueue
* , ,
*/
function deepCopy(obj) {
var newObj = {},
/** 4 */
srcQueue = [obj], srcVisitedQueue = [],
copyQueue = [newObj], copyVisitedQueue = [];
while (srcQueue.length > 0) {
//
var currentSrcElement = srcQueue.shift(),
currentCopyElement = copyQueue.shift();
//
srcVisitedQueue.push(currentSrcElement);
copyVisitedQueue.push(currentCopyElement);
//
for (var key in currentSrcElement) {
//
if (typeof currentCopyElement[key] !== 'object') {
currentCopyElement[key] = currentSrcElement[key];
//
} else {
//
var index = srcVisitedQueue.indexOf(currentSrcElement[key]);
if (index >= 0) {
//
currentCopyElement[key] = copyVisitedQueue[index];
} else {
// , , ,
// ,
srcQueue.push(currentSrcElement[key]);
currentCopyElement[key] = {};
copyQueue.push(currentCopyElement[key]);
}
}
}
}
return newObj;
}
// Test case
// 1. Object{a: 1, b:2} => pass
// 2. Object => pass:
// var obj1 = {
// a: 1,
// b: 2,
// c: {
// d: 3,
// e: {
// f: 4,
// g: 5
// }
// },
// h: {
// i: 6,
// j: 7
// }
// };
// 3. Object => pass:
// var obj1 = {
// a: 1,
// b: 2,
// c: obj1
// };
관련 주석 은 코드 에 직접 넣 었 습 니 다. 물론 소스 코드 에 대해 고려 하지 않 은 것 이 적지 않다 는 것 을 부인 하지 않 지만 이 깊이 있 는 복사 와 링 이 있 는 지 판단 하 는 방법 이 정교 하 다 는 것 을 부인 할 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.