3

我希望找到一個示例代碼來深入複製ECMAScript5中的對象。對象和數組的ECMAScript5深層副本

複印應該能夠克隆

  • 嵌套對象

  • 嵌套數組

  • 在陣列(克隆單獨地每個數組項)嵌套對象

注意:jQuery.extend()似乎不處理ca se 3)。另外,我希望在乾淨的ECMAScript中做到這一點。快速谷歌搜索沒有提出任何有價值的實施。

+0

深複製是一個不平凡的問題,我建議你改變你的算法,所以它與淺拷貝 – Raynos

+0

目前我的工作我正在使用jQuery.extend()並手動清理混亂後 –

回答

0

使用toSource methodemulation複製對象:如果你想要一個

<script type="text/javascript"> 
    Object.prototype.getSource = function() { 
     var output = [], temp; 
     for (var i in this) { 
      if (this.hasOwnProperty(i)) { 
       temp = i + ":"; 
       switch (typeof this[i]) { 
        case "object" : 
         temp += this[i].getSource(); 
         break; 
        case "string" : 
         temp += "\"" + this[i] + "\""; // add in some code to escape quotes 
         break; 
        default : 
         temp += this[i]; 
       } 
       output.push(temp); 
      } 
     } 
     return "{" + output.join() + "}"; 
     } 
     var baz = {"alpha":{"beta":{"charlie": ["delta","epsilon",{"omega":"zeta"}]}}}; 
     !!Object.prototype.toSource ? alert((baz).toSource()) : alert((baz).getSource()); 
    </script> 
+0

一開始,但不是這個有點脆弱..循環引用可能無限循環? –

+0

[聯繫開發人員](http://stackoverflow.com/users/9021/nickf)以獲取有關健壯性的幫助。 –

1

-liner(通過遍歷引用對象來檢索基元,將一個大字符串連接起來,然後將字符串解析爲一個新的對象,並使用它自己的原始葉節點)來移除對象引用)

JSON.parse(JSON.stringify(obj)) 

,或者如果您需要進行許多副本

function deepCopy(o) { 
    var copy = o,k; 

    if (o && typeof o === 'object') { 
     copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {}; 
     for (k in o) { 
      copy[k] = deepCopy(o[k]); 
     } 
    } 

    return copy; 
} 

performance comparison

+0

你是什麼意思?這確實執行了深層複製。它不是特別的ECMAScript5,但jQuery都不是正確的? – neaumusic

+0

對不起!我的意思是說請解釋代碼在做什麼? – Saifur

+1

好吧,是非常簡短的。添加說明:) – neaumusic