Javascript:转换代码字符串和返回
Javascript: Convert code string and back
假设我有以下代码:
var cfg = {
config: {
fields: {
name: {
type: 'text'
},
age: {
type: 'number'
}
},
actions: [
{
label: 'Print',
cb: (model) => {
console.log(model);
}
}
]
},
data: {name: 'Jhon', age: 23}
}
我想把它转换成一个字符串(让用户编辑它),然后把它转换回可执行代码,任何想法在如何实现这一点?
我尝试了JSON.stringify
和JSON.parse
,但这当然会剥离函数。.toString
返回"[object Object]"
,在对象上迭代并调用.toString
,当值是字符串,函数或数字是可能的,还有其他想法吗?
Function构造函数接受字符串形式的代码,eval和其他几个函数也是如此。但是,如果可以避免的话,请不要将代码转换为字符串或向后转换,因为考虑到安全问题、调试能力以及这样做时可能遇到的许多其他问题。
将代码转换为字符串有点烦人,因为你需要确保你没有重新声明变量,并且新上下文中的所有内容在语法上都是正确的,例如,请注意obj
的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
参数,可用于自定义进程。
我再次强烈建议尽可能避免任何代码与字符串之间的转换,在所有正常情况下,这是不需要的,也不应该这样做。
您可以遍历该对象并将其设置为输入元素,如下所示
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]+'">')
}
这是我想到的解决方案:
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/)
- .value返回字符串,直到我将其保存到变量
- 无法从量角器测试中元素的值返回字符串
- 如何使用match返回字符串中的字符
- document.write未返回字符串
- $.ajax 检查返回字符串是否为“错误”
- jQuery AJAX调用PHP脚本并返回字符串
- javascript中对数字数组的迭代返回字符串
- 带多维数组返回字符串的json_encode;阵列”;而不是数据
- javascript只返回字符串的一级域名
- 使用Node.js'fs.readFile()返回字符串出现的行
- Javascript返回字符串
- Asp.net WebMethod-返回字符串[]并使用JavaScript进行解析
- 返回字符串中第一个数字之前出现的所有字母
- Javascript 计算器返回字符串而不是值
- EmberJs 将函数的返回字符串添加为类名
- 跨域 AJAX 调用返回字符串 JSON,而不是 JSON 对象
- Javascript:调整base64图像的大小并以非异步方式返回字符串
- 量角器/JavaScript - 从选择下拉列表中返回字符串的函数
- 在 JavaScript 中返回字符串
- 数组 .each() 循环返回字符串而不是 jQuery 中的值