БЫСТРЫЙ ОТВЕТ:
Функция ниже будет делать:
function fix(obj){
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
obj[property] = eval("(" + obj[property] + ")");
}
}
}
Если OBJ имеет свой JSON проанализирован объект, то нужно сделать следующее:
fix(obj);
console.log(obj); // in case you want to see the change in the console
EXPLANAT ION (ЕСЛИ ВАМ НУЖНО ОДИН):
Вы сможете получить выражение функции javascript, если вы вставляете строку с круглыми скобками '()' перед вызовом eval.
Итак шаги, чтобы достичь желаемого результата, являются:
- Заключите строковое выражение функции в скобках (см сносок по той причине, почему)
- Вызов функции Eval для вычисления выражения функции декларации
- Присвоить выражение объявления функции тому же свойству, которое содержит значение строки
Для упрощенного примера, который вы указали, вы можете получить желаемые результаты по:
var obj = {"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g
[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio=
{provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if
('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||
d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"};
obj.get = eval("(" + obj.get + ")");
obj.post = eval("(" + obj.post + ")");
Вы можете автоматизировать, что с помощью следующей функции:
function fix(obj){
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
obj[property] = eval("(" + obj[property] + ")");
}
}
}
Ваш окончательный код должен быть что-то вроде:
function fix(obj){
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
obj[property] = eval("(" + obj[property] + ")");
}
}
}
var obj = {"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g
[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio=
{provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if
('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||
d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"};
fix(obj);
Сноски:
В случае, если у вас есть интерес узнать, почему круглые скобки необходимы, пожалуйста, проверьте ссылку ниже:
Why does JavaScript's eval need parentheses to eval JSON data?
с 'eval' или' Function' (после некоторой предварительной обработки). Вы можете автоматизировать это, передав функцию reviver на 'JSON.parse', как описано в [документации MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ JSON/синтаксический анализ). Однако я настоятельно рекомендую хранить данные как данные. –
Я пробовал оба, но ничего. 'eval' не работает, потому что значения не имеют имени функции. –
'eval ('+ str +') ')' –