JS:如何将字符串转换为JS对象(**不**转换为JSON)?

杰里米·蒂尔

我知道如何解析有效的JSON字符串:JSON.parse('{"key" : "value"}')

但是,有效的JS对象却无效的JSONJSON.parse("{ key : 'value'}")怎么样:上面的示例抛出:

未捕获到的SyntaxError:JSON中位置2处的意外令牌k

我的实际目标更加棘手。我想将包含RegEx(不受JSON支持,但受JS支持)的JS对象的字符串解析为JS对象:

'{ key1 : /val1/g , key2 : /val2/i }'

我最终想将这个对象与Mongoose一起使用,并找到它的文档:

Model.find({
     key1 : /val1/g ,
     key2 : /val2/i
})

我尝试将相当复杂的RegEx应用于我的String,替换/val1/gnew RegEx("val1","i")

str = str.replace( /\/(.+?)\/(g?i?).+?(?=,|})/g , "new RegExp(`$1`,`$2`)" )

.replace()操作有效,并以我想要的方式修改了字符串。它产生:

{ key1 : new RegExp("val1","g") , key2 : new RegExp("val2","i") }

但是当我尝试应用JSON.parse它时,它仍然失败,因为new RegEx("val1","i")它不是有效值。

TJ人群

如果您可以控制并信任要转换的文本,则可以使用eval

var str = '{ key1 : /val1/g , key2 : /val2/i }';
var obj = eval("(" + str + ")");
console.log(obj.key1);

请注意,在执行时eval,由于表达式以开头{,因此必须将其包装起来,()以便解析器知道这是在启动对象初始化程序,而不是块。

关于以下几点注意事项eval

  1. 它允许任意代码执行。因此,您确实必须信任您要eval输入的文字不要eval用户输入。

  2. 直接包含调用的执行上下文中的代码eval基本上无法优化,因为JavaScript引擎在解析代码时不知道字符串将包含什么。因此,尽管从技术上讲我认为这是过早的优化,但我还是将上述内容包含在您从主逻辑调用的函数中,而不是直接将其嵌入主逻辑中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章