2012-02-22 55 views
5

我正在試着製作一個複製數組數組的函數。我試過blah.slice(0);但它只複製引用。我需要做一個複製品,保持原來的完整。如何複製或複製數組陣列

我發現這個原型法在http://my.opera.com/GreyWyvern/blog/show.dml/1725165

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

它的工作原理,但打亂了我使用jQuery插件 - 所以我需要把它放到一個函數...和遞歸是不是我的最強的。

您的幫助將不勝感激!

乾杯,

+1

一定要申報 「I」 與'var'!使用'for ... in'循環迭代數組也是有風險的 - 使用數字索引更安全。 – Pointy 2012-02-22 17:02:06

+0

請參閱:http://stackoverflow.com/questions/565430/deep-copying-an-array-using-jquery – 2012-02-22 17:04:04

回答

5
function clone (existingArray) { 
    var newObj = (existingArray instanceof Array) ? [] : {}; 
    for (i in existingArray) { 
     if (i == 'clone') continue; 
     if (existingArray[i] && typeof existingArray[i] == "object") { 
     newObj[i] = clone(existingArray[i]); 
     } else { 
     newObj[i] = existingArray[i] 
     } 
    } 
    return newObj; 
} 
+0

這工作完美!謝謝。 – Jeremy 2012-02-22 17:16:45

+0

真棒。正是我需要的! – tuj 2014-03-05 13:02:02

2

例如:

clone = function(obj) { 
    if (!obj || typeof obj != "object") 
     return obj; 
    var isAry = Object.prototype.toString.call(obj).toLowerCase() == '[object array]'; 
    var o = isAry ? [] : {}; 
    for (var p in obj) 
     o[p] = clone(obj[p]); 
    return o; 
} 

改善按照意見

+1

將打破「null」(null.pop將拋出)。第一個檢查應該是'if(typeof obj!=「object」||!obj)'。 – 2012-02-22 17:06:03

+0

此外,可疑的處理繼承屬性 - JavaScript中的「克隆」有問題的語義。 – Pointy 2012-02-22 17:07:16