비 재 귀적 깊이 복사

2401 단어
선행 코드 원본
//         ,     

/**
 *        ,                  
 *         ,      
 * 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
// };

관련 주석 은 코드 에 직접 넣 었 습 니 다. 물론 소스 코드 에 대해 고려 하지 않 은 것 이 적지 않다 는 것 을 부인 하지 않 지만 이 깊이 있 는 복사 와 링 이 있 는 지 판단 하 는 방법 이 정교 하 다 는 것 을 부인 할 수 없습니다.

좋은 웹페이지 즐겨찾기