2014-02-13 4 views
0

Мне нужно объявить две переменные с одинаковым значением, на самом деле разобранный json. Они не должны ссылаться на один и тот же объект.определить две переменные с тем же значением

Есть ли лучший способ сделать это, чем объявление переменных отдельно с тем же значением, т.е.

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

Это, наверное, самое лучшее, что делать, так как глубокие копии может быть проблематичным и синтаксический довольно быстро, если JSON не огромна (в этом случае глубокая копия будет быть слишком медленным). (На самом деле, я думаю, что глубокая копия только что разобранного блога JSON не столкнулась бы с чем-то сложным, как циклы, но я бы все еще просто разбирал дважды.) – Pointy

+0

Возможно, вы захотите изучить клонирование объектов JavaScript: http: // stackoverflow .com/questions/728360/most-elegant-way-to-clone-a-javascript-object – Frithjof

+0

@ Великолепное спасибо, я пытался избежать всех этих элементов дублирования, я должен сделать это для более чем 10 переменных ... но если это лучший способ пойти, я буду придерживаться его – marcosh

ответ

0

, так как моя переменная а просто не Вложенный массив, я думаю, что лучший способ пойти использовать

b = a.slice(); 
+0

Объекты не имеют метода 'slice'. Представьте, что происходит с JSON, как '{" s ":" "}' – loxxy

+0

Я знаю, я просто говорю о моем конкретном случае – marcosh

+0

Если * myJson * - это просто массив чисел и строк, он может работать, но опять же, если он имеет объекты в массиве, которые они не будут скопированы. – loxxy

0

для преобразования текста JSON в объект, вы можете использовать Eval() функции. Функция eval работает очень быстро. Однако он может компилировать и выполнить любую программу JavaScript, поэтому могут возникнуть проблемы с безопасностью. Чтобы защитить его, следует использовать парсер JSON. (link)

Если вы посмотрите на JSON.parse (по Doughlas Crockford), он в основном готовит строку для 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); 
Смежные вопросы