2014-02-13 69 views
0

我需要聲明兩個具有相同值的變量,實際上是一個解析的json。他們不應該提到同一個對象。定義兩個變量具有相同的值

有沒有更好的方式來做到這一點比同值分別聲明變量,即

var a = JSON.parse(myJson), 
     b = JSON.parse(myJson); 
+0

這可能是做的最好的事情,因爲深拷貝可能會產生問題和分析是非常快的,除非JSON是巨大的(在這種情況下,深拷貝會當然也慢)。 (其實我猜JSON的一個剛剛解析過的blob的深層副本不會遇到任何像循環一樣複雜的問題,但我仍然只需解析兩次。) – Pointy

+0

您可能想要查看克隆JavaScript對象:http:// stackoverflow .com/questions/728360 /最優雅的方式克隆一個JavaScript對象 – Frithjof

+0

@Pointy謝謝,我試圖避免所有這種重複sice我必須做超過10個變量......但如果這是更好的方法,我會堅持下去 – marcosh

回答

0

,因爲我的變量只是一個非嵌套數組,我認爲,去最好的方法是使用

b = a.slice(); 
+0

對象沒有方法'切片'。想象一下像'{「s」:「」}這樣的JSON會發生什麼? – loxxy

+0

我知道,我只是在談論我的特殊情況 – marcosh

+0

如果* myJson *只是一個數字和字符串數組,它可以工作,但如果if它有數組中的對象,它們不會被複制。 – loxxy

0

要將JSON文本轉換成一個對象,你可以使用eval()函數 。 eval函數非常快。但是,它可以編譯和執行任何JavaScript程序,所以可能存在安全問題。爲了防禦它,應該使用JSON解析器。 (link

如果你看一下JSON.parse(由Doughlas克羅克福德),它主要準備的eval的字符串。所以你可以保存準備好的字符串&使用eval就可以了。

JSON.prepare = function(text) { 
    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; 
    cx.lastIndex = 0; 
    if (cx.test(text)) { 
     text = text.replace(cx, function (a) { 
      return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 
     }); 
    } 
    if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') 
     .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') 
     .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { 

     return '(' + text + ')'; 
    } 
}; 

,並用它作爲:

myJson = JSON.prepare(myJson); 

var a = eval(myJson), 
    b = eval(myJson); 
相關問題