2016-08-17 99 views
0

假设我有这样的代码:的Javascript:转换代码串和背部

var cfg = { 
    config: { 
    fields: { 
     name: { 
     type: 'text' 
     }, 
     age: { 
     type: 'number' 
     } 
    }, 
    actions: [ 
     { 
     label: 'Print', 
     cb: (model) => { 
      console.log(model); 
     } 
    } 
    ] 
    }, 
    data: {name: 'Jhon', age: 23} 
} 

我想将其转换为字符串(让用户编辑它),然后将其转换回可执行代码,任何想法如何实现这一目标?

我试过JSON.stringifyJSON.parse,但那当然会剥离这些功能。 .toString返回"[object Object]",迭代对象并调用.toString当值是一个字符串,函数或数字是可能性,任何其他的想法?

+2

你真的需要:

用户编辑它后,它与执行你的用户编辑功能? – Bergi

+0

是的,我需要的是,它是一个关于如何使用和合成UI组件的教程,所以我需要用户编写一些代码并执行它。 – teone

+0

然后,您应该从一个字符串开始,而不是一个对象。不要来回转换,只能在字符串上使用'eval'。对于初始代码,将其放入字符串文字中或从文件中加载它。 – Bergi

回答

0

可以遍历周围的物体,并设置为输入要素,这样

for (var key in cfg.config.fields) { 
    console.log(key, cfg.config.fields[key].type); 
    console.log(key, cfg.data[key],'data'); 
    console.log('<input type="'+cfg.config.fields[key].type+'" value="'+cfg.data[key]+'">') 
} 
+0

是的,这是我遵循的方式......它实际上有点复杂,因为我们不知道结构,但递归函数发挥了作用。我会尽快发布。 – teone

1

Function构造函数采用代码串,所以不eval和一对夫妇等。但是,如果以任何方式避免,请不要将代码转换为字符串,也不要将代码转换回来,因为存在安全问题,调试能力以及在执行此操作时可能遇到的许多其他问题。

将代码转换为字符串有点烦人,因为您需要确保不重新声明变量,并且新环境中的所有内容在语法上都是正确的,例如,请注意0​​的f属性在声明中再次被命名,因为它稍后被赋予eval,它将其放置在需要名称的全局范围中。

let obj = { f: function f() { let stuff = "hi"; console.log("hi"); } }; 
 
let code = obj.f.toString(); 
 
console.log(code); 
 
eval(code); 
 
f();

注意JSON.stringify有一个可选replacer参数可用于定制过程。

我将再次高度建议,以避免从字符串转换任何代码/可能的,在一切正常的情况下,这是不需要的时候,不应该做的。

+0

在我们的案例中是受控环境中的教程,所以没有安全问题 – teone

0

这是我想出了解决方案:

const toString = (code) => { 
    if(Array.isArray(code)){ 
    return code.map(item => toString(item)); 
    } 
    else if(typeof code == 'object'){ 
    let tmp = {}; 
    Object.keys(code).forEach(key => { 
     tmp[key] = toString(code[key]) 
    }); 
    return tmp; 
    } 
    else{ 
    return code.toString().split('\n').join('').replace(/ +(?=)/gmi, ''); 
    } 
}; 

这将递归地遍历整个随机JS结构的所有属性(包含对象和数组的对象)的返回包含字符串对应的结构,则然后可以使用JSON.stringify来获取实际的字符串。

eval(`(${string})`); 

正如其他指出,要小心使用eval,它可能是危险的(一个有趣的文章是https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/