2014-03-03 84 views
-1

我想標題是相當微不足道的。基本上我想要的東西就像mysqldump ... --no-data ...。例如,我有一個JSON對象是這樣的:什麼是複製/克隆JSON對象結構的最有效方法?

{ "key1" : "value1", 
    "key2" : "value2", 
    "key3" : { 
     "key3a" : 1, 
     "key3b" : 2 
    }, 
    "key4" : "value3" 
} 

而且我想要的是和空對象具有相同的結構,像這樣:

{ "key1" : null, 
    "key2" : null, 
    "key3" : { 
     "key3a" : null, 
     "key3b" : null 
    }, 
    "key4" : null 
} 
+0

基本上你想要一個null對象的副本來代替字符串和數字,對嗎? – MarcoL

+0

你必須創建一個包含json的所有標籤的對象,並用null值填充該對象的值,並對該對象進行序列化 – User7291

回答

1

你需要的是類似於通常是所謂的「深度克隆」,你似乎想要返回null以表示不是對象。做這種克隆的最簡單的方法是用遞歸函數:

function deepAutomnClone(o){ 
    if (typeof o !== 'object') return null; 
    var c = {}; 
    for (k in o) c[k] = deepAutomnClone(o[k]); 
    return c; 
} 

你會這樣稱呼它:

var obj = { "key1" : "value1", 
    "key2" : "value2", 
    "key3" : { 
     "key3a" : 1, 
     "key3b" : 2 
    }, 
    "key4" : "value3" 
}; 
console.log(deepAutomnClone(obj)); 

現在,你不是在你的問題非常精確。您可能想要修改該函數,具體取決於所需的數組處理。

最後一件事:請注意,您擁有的不是「JSON對象」,因爲JSON是基於文本的交換格式。這是一個普通的JavaScript對象。

0

這是一個解決方案,支持重置對象以外的陣列。 它也避免了設置爲null的對象的屬性將被繼承。

function cloneAndReset(obj) { 

    var res = null; 

    if (obj instanceof Array) { 
     res = []; 
     for (var i = 0; i < obj.length; i++) { 
       res[i] = cloneAndReset(obj[i]); 
     } 
     return res; 
    } 

    if (obj instanceof Object) { 
     res = {}; 
     for (p in obj) { 
      if (obj.hasOwnProperty(p)) {        
       res[p] = cloneAndReset(obj[p]); 
      } 
     } 
    } 

    return res; 
} 
相關問題